繁体   English   中英

C++ 中已删除的 function 模板的显式实例化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM