sky*_*ack 11 c++ templates language-lawyer template-argument-deduction c++17
请考虑以下代码段:
struct S {
S() {}
template<typename B>
struct T {
T(B &&) {}
};
template<typename B>
T(B &&) -> T<B>;
};
int main() {
S::T t{0};
}
Run Code Online (Sandbox Code Playgroud)
prog.cc:10:5:错误:演绎指南'S :: T(B &&) - > S :: T'必须在命名空间范围内声明
这是有效的代码吗?哪个编译器是对的,GCC还是Clang?
Jar*_*d42 13
根据http://en.cppreference.com/w/cpp/language/class_template_argument_deduction
用户定义的演绎指南必须命名一个类模板,并且必须在类模板的同一语义范围内引入(可以是命名空间或封闭类),对于成员类模板,必须具有相同的访问权限,但演绎指南必须具有相同的访问权限.不成为该范围的成员.
所以铿锵似乎是对的.