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

时间:2016-07-09 07:15:15

标签: c++ noexcept exception-specification deleted-functions

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

图表A:

struct A
{
    A() = delete;
};

展览A':

struct A
{
    A() noexcept = delete;
}

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

1 个答案:

答案 0 :(得分:9)

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

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

编辑:

hvd在下面的评论中提到,noexcept(f())不会调用f()。如果类A的构造函数是delete d,那么noexcept(A())将无法编译,无论构造函数是否被声明为noexcept。这(基本上)是要求noexcept(expression)被赋予有效表达式的结果 - 而类A()的表达式A需要有效的构造函数。

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