考虑以下示例:
template <typename T>
using type = typename T::type;
template <typename T>
struct A
{
A(type<T>);
};
A<int> f();
A<int> g() { return f(); }
由于int
没有嵌套的type
typedef,因此gcc和clang都不会编译此代码。但是,为什么要完全实例化该构造函数? f()
是与g()
的返回值相同类型的prvalue,甚至不应在那里移动。是什么导致我们实例化错误的构造函数?
答案 0 :(得分:9)
构造函数有点像鲱鱼。如果是其他任何成员函数,也会发生同样的情况。
template <typename T>
struct A
{
void foo(type<T>); // Same error
};
这是由于[temp.inst]/2
类模板专门化的隐式实例化导致 声明的隐式实例化,但不是 类的定义,默认参数或noexcept指定符 成员函数,[...]
声明是实例化的,因此type<T>
必须格式正确。