考虑这个例子:
template <typename T> using type = typename T::type; template <typename T> struct A { A(type<T>); }; A<int> f(); A<int> g() { return f(); }
由于没有嵌套类型typedef,gcc和clang都没有编译这段代码.但是为什么构造函数会被实例化呢? f()是与g()返回相同类型的prvalue,甚至不应该在那里移动.是什么导致我们实例化坏构造函数?
解决方法
构造函数有点像红鲱鱼.如果它是任何其他成员函数,也会发生同样的情况.
template <typename T> struct A { void foo(type<T>); // Same error };
这是因为[temp.inst]/2
The implicit instantiation of a class template specialization causes
the implicit instantiation of the declarations,but not of the
definitions,default arguments,or noexcept-specifiers of the class
member functions,[…]
声明被实例化,因此键入< T>必须是良好的形式.