看到这个问题后何时检查 C++ 模板实例化类型? https://stackoverflow.com/q/34204483/2805305,并且很长一段时间以来我都在想同样的事情,我开始玩代码来吸收知识。答案给出了明确且正确的解释。它提到了两阶段名称查找以及翻译单元的末尾也被视为函数模板的实例化点的事实。但是,我在使用自动返回类型推导时观察到不同的行为:
这就像原始代码。它是正确的,并且按照链接帖子中的说明工作:
class A;
class B;
template <class T> auto foo() -> T * {
A *pa = nullptr; // ignore pa being `nullptr`.
return static_cast<T *>(pa);
}
auto test() { return foo<B>(); }
class A {};
class B : public A {};
当模板使用自动返回类型推导时foo
, 的定义A
and B
必须出现在实例化点之前foo
:
不工作:
class A;
class B;
template <class T> auto foo() { // automatic return type deduction
A *pa = nullptr;
return static_cast<T *>(pa);
}
auto test() { return foo<B>(); }
class A {};
class B : public A {};
gcc 的错误(4.9 和 5.2.1):
错误:从类型“A*”到类型“B*”的 static_cast 无效
Clang 给出了类似的错误
Working:
class A;
class B;
template <class T> auto foo() { // automatic return type deduction
A *pa = nullptr;
return static_cast<T *>(pa);
}
class A {};
class B : public A {};
auto test() { return foo<B>(); }
为什么会发生这种情况?为什么关于编译单元结束被视为实例化点的规则不再使模板实例化合法?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)