考虑以下片段:
struct S {
S() {}
template<typename B>
struct T {
T(B &&) {}
};
template<typename B>
T(B &&) -> T<B>;
};
int main() {
S::T t{0};
}
Clang 接受它 https://wandbox.org/permlink/Dgkltwsz4Px2foxA而海湾合作委员会拒绝该代码 https://wandbox.org/permlink/q4mI8tP4FYmiYiJC出现以下错误:
prog.cc:10:5: 错误:推导指南 'S::T(B&&) -> S::T' 必须在命名空间范围内声明
这是有效的代码吗? GCC 还是 Clang 哪个编译器是正确的?
根据http://en.cppreference.com/w/cpp/language/class_template_argument_deduction http://en.cppreference.com/w/cpp/language/class_template_argument_deduction
用户定义的推导指南必须命名类模板,并且必须在类模板的相同语义范围内引入(可以是命名空间或封闭类),并且对于成员类模板,必须具有相同的访问权限,但推导指南确实如此不成为该范围的成员。
所以 clang 似乎是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)