इस उदाहरण पर विचार करें ( यहाँ से आ रहे हैं ):
#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 और clang 10.0.0 Bको पूरा नहीं होने के बारे में शिकायत करता है । Clangs त्रुटि है:
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।