将删除的函数声明为noexcept是否有任何意义?

use*_*177 10 c++ exception-specification deleted-functions noexcept

考虑这两个可能的类定义:

图表A:

struct A
{
    A() = delete;
};
Run Code Online (Sandbox Code Playgroud)

图表A':

struct A
{
    A() noexcept = delete;
}
Run Code Online (Sandbox Code Playgroud)

声明删除的函数是否有任何意义noexcept

Pet*_*ter 9

(最初将此作为评论发布,但鼓励发布作为答案.)

简单地说,没有.无法调用已删除的函数(或者,在构造函数的情况下,用于初始化对象),更不用说抛出异常.

编辑:

在下面的评论中提到的hvd noexcept(f())没有打电话f().如果类的构造函数Adeleted,那么noexcept(A())无论是否声明构造函数,都将无法编译noexcept.这(基本上)是要求noexcept(expression)被赋予有效表达式的结果 - 并且A()类的表达式A需要有效的构造函数.

Revolver_Ocelot还正确地指出不可能重载noexcept(即,不可能有两个具有相同签名的函数,除了一个是noexcept一个而一个不是).所以,类的定义中A,都A() = deleteA() noexcept = delete都具有相同的效果,即类A不具有非参数的构造函数.

  • `noexcept`不仅影响函数调用.你是对的,如果一个函数无法调用,函数调用就不会受到影响.但是`noexcept`一般可以在不调用任何东西的情况下发挥作用,最明显的是通过`noexcept`运算符(`noexcept(f())`不调用`f()`).我认为一个好的答案也应该解释为什么没有其他案件适用(例如,如果所有的这些其他情况只适用于可调用的函数,它们并不适用于删除功能),或者如果可能的话(我怀疑它不是),给出一个反例. (4认同)