扣除指南,模板和子对象:哪个编译器是对的?

时间:2018-05-30 09:06:42

标签: c++ templates language-lawyer c++17 template-deduction

请考虑以下代码段:

layout.ejs

在GCC accepts it时发出rejects the code,并出现以下错误:

  

prog.cc:10:5:错误:扣除指南' S :: T(B&&) - >的s :: T'必须在命名空间范围内声明

这是有效的代码吗?哪个编译器是对的,GCC还是Clang?

1 个答案:

答案 0 :(得分:13)

根据http://en.cppreference.com/w/cpp/language/class_template_argument_deduction

  

用户定义的演绎指南必须命名一个类模板,并且必须在类模板的同一语义范围内引入(可以是命名空间或封闭类),对于成员类模板,必须具有相同的访问权限,但是扣除指南不会成为该范围的成员。

所以铿锵似乎是对的。