이 예제를 고려하십시오 ( here ).
#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에 오류없이 컴파일 에 대한 불평 10.0.0하지만 gcc7.2와 연타 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
.