এই উদাহরণটি বিবেচনা করুন ( এখান থেকে আসছেন ):
#include <type_traits>
#include <iostream>
template <typename U>
struct A {
};
struct B {
template <typename F = int>
A<F> f() { return A<F>{}; }
using default_return_type = decltype(std::declval<B>().f());
};
int main()
{
B::default_return_type x{};
std::cout << std::is_same< B::default_return_type, A<int>>::value;
}
এটি gcc9.2 তে কোনও ত্রুটি না দিয়ে সংকলন করে তবে gcc7.2 এবং ঝাঁকুনি 10.0.0 Bসম্পূর্ণ না হওয়ার বিষয়ে অভিযোগ করে । ঝাঁকুনির ত্রুটিটি হ'ল:
prog.cc:11:58: error: member access into incomplete type 'B'
using default_return_type = decltype(std::declval<B>().f());
^
prog.cc:7:8: note: definition of 'B' is not complete until the closing '}'
struct B {
^
prog.cc:16:8: error: no type named 'default_return_type' in 'B'
B::default_return_type x{};
~~~^
prog.cc:17:35: error: no member named 'default_return_type' in 'B'
std::cout << std::is_same< B::default_return_type, A<int>>::value;
~~~^
std::declvalএটির থেকে উদাহরণ পেয়ে গেলে আর কিছু যায় আসে না যদি প্রকারটি সম্পূর্ণ হয় বা না (এবং আমি অনুমান করি যে আমি এতে ভুল করছি)
Bসম্পূর্ণ বা সম্পূর্ণ হিসাবে বিবেচনা করা হয় না alias-declaration।
.f()। এটা বোধগম্য; অসম্পূর্ণ টাইপেরBকোনও সদস্য নেইf।