Can you `= delete` a templated function on a second declaration?

ein*_*ica 18 c++ gcc clang nvcc compiler-bug

Consider the following code:

template <typename T> int foo();
template <typename T> int foo() = delete;
Run Code Online (Sandbox Code Playgroud)

is this valid C++11?

  • GCC (9.1) says: Yes!
  • clang (8.0) says: No!
  • nvcc (9.2) says: No!
  • MSVC (19.20) says: Yes! (in C++14 mode, it doesn't support C++11.)

... see it all on GodBolt.

so which compilers are right and which compilers are s@#$%e ? :-)

Sto*_*ica 22

GCC和MSVC有一个错误。

[dcl.fct.def.delete]

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

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

  • @einpoklum-引用它的代码可以在第一个声明和定义之间。我想在第一个声明中要求它是最简单的。就像我引用n4659(C ++ 17,没有注意到标签)一样,是的。我检查了n3337(c ++ 11),措辞是一样的。 (3认同)