考虑这个例子:
template <typename T>
using type = typename T::type;
template <typename T>
struct A
{
A(type<T>);
};
A<int> f();
A<int> g() { return f(); }
gcc 和 clang 都无法编译此代码,因为int
没有嵌套type
类型定义。但为什么要实例化该构造函数呢?f()
是与返回类型相同的纯右值g()
,那里甚至不应该有任何移动。是什么导致我们实例化错误的构造函数?
构造函数有点转移注意力。如果是任何其他成员函数,也会发生同样的情况。
template <typename T>
struct A
{
void foo(type<T>); // Same error
};
这是由于[温度设置]/2 https://timsong-cpp.github.io/cppwp/n4659/temp.inst#2
类模板特化的隐式实例化导致
声明的隐式实例化,但不是
类的定义、默认参数或 noexcept 说明符
成员函数,[...]
该声明已实例化,因此type<T>
必须是格式良好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)