将已删除的函数声明为 noexexcept 有什么意义吗?

Is there any point in declaring a deleted function as noexcept?

本文关键字:什么 noexexcept 删除 函数 声明      更新时间:2023-10-16

考虑类的以下两个可能的定义:

图表 A:

struct A
{
    A() = delete;
};

附件 A′:

struct A
{
    A() noexcept = delete;
}

将已删除的函数声明为noexcept有什么意义吗?

(最初作为评论发布,但鼓励发布作为答案。

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

编辑:

HVD在下面的评论中提到,noexcept(f())不打电话给f()。 如果类 A 的构造函数是 delete d,则无论构造函数是否声明为 noexceptnoexcept(A()) 都将编译失败。 这(本质上)是要求noexcept(expression)给定有效表达式的结果 - 并且类A的表达式A()需要有效的构造函数。

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