1

如果函数模板被标记为已删除,是否允许像示例中那样显式实例化它:

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

template int foo(int);

Clang 和 GCC 允许它,而 MSVC 打印错误:

error C2280: 'int foo<int>(int)': attempting to reference a deleted function

演示:https ://gcc.godbolt.org/z/49hfqnr4f

哪个编译器在这里?

4

1 回答 1

3

Clang 和 GCC 是对的。MSVC 可能指的是以下规则([dcl.fct.def.delete]/2):

隐式或显式引用已删除函数(而不是声明它)的程序是格式错误的。

显式实例化定义是一个声明,因此是允许的。

虽然,公平地说,在这种情况下“引用”的含义尚不清楚,因此语言律师仍有一些空间。但很明显,一般而言,仅允许实例化模板以生成删除的函数定义。[temp.inst]/3.2还提到了隐式实例化类模板时发生的已删除成员函数的隐式实例化。如果实例化一个模板化实体以产生一个已删除的函数定义的格式不正确,则不可能使用std::atomic具有已删除复制构造函数的类模板。您的程序只是显式地执行在这些情况下隐式发生的事情。

于 2021-12-09T19:50:34.563 回答