【问题标题】:Explicit instantiation of a deleted function template in C++C++ 中已删除函数模板的显式实例化
【发布时间】:2022-01-14 15:03:25
【问题描述】:

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

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

哪个编译器在这里?

【问题讨论】:

    标签: c++ templates language-lawyer explicit-instantiation deleted-functions


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!只是为了澄清我正确理解显式实例化定义是声明。如果删除函数模板的主体并请求其显式实例化,是否会像本例一样出现错误gcc.godbolt.org/z/WMs5deGha
    • @Fedor 我不确定这与答案有什么关系。但见eel.is/c++draft/temp.explicit#7
    猜你喜欢
    • 2011-10-07
    • 2019-04-15
    • 1970-01-01
    • 2011-06-23
    • 2014-02-26
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多