您可以在第二个声明中“ =删除”模板函数吗?

时间:2019-06-01 18:52:27

标签: c++ gcc clang nvcc compiler-bug

考虑以下代码:

template <typename T> int foo();
template <typename T> int foo() = delete;

这是有效的C ++ 11吗?

  • 海湾合作委员会(9.1)说:是!
  • c(8.0)说:不!
  • nvcc(9.2)说:不!
  • MSVC(19.20)说:是的! (在C ++ 14模式下,它不支持C ++ 11。)

...在GodBolt上查看全部内容。

那么哪些编译器正确,哪些编译器是s @#$%e? :-)

1 个答案:

答案 0 :(得分:14)

GCC和MSVC有一个错误。

  

[dcl.fct.def.delete]

     

4 ...已删除的函数定义应为该函数的第一个声明,或者,对于功能模板的显式特化,应为该特化的第一个声明...

我相信其中也代表实例化的声明和定义。由于引用已删除的函数是一个硬错误,因此必须将其声明为尽快删除。