[英]Explicit instantiation of a deleted function template in C++
如果 function 模板被标记为已删除,是否允许显式实例化它,如示例所示:
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
哪个编译器在这里?
Clang 和 GCC 是对的。 MSVC 可能指的是以下规则( [dcl.fct.def.delete]/2 ):
一个程序隐式或显式地引用已删除的 function,而不是声明它,是格式错误的。
显式实例化定义是一个声明,因此是允许的。
虽然,公平地说,在这种情况下“引用”的含义尚不清楚,因此语言律师仍有一些空间。 但很明显,一般而言,仅允许实例化模板以生成删除的 function 定义。 [temp.inst]/3.2还提到了隐式实例化 class 模板时发生的已删除成员函数的隐式实例化。 如果实例化模板化实体以生成已删除的 function 定义格式不正确,则无法使用具有已删除复制构造函数的std::atomic
等 class 模板。 您的程序只是显式地执行在这些情况下隐式发生的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.