将已删除的函数声明为 noexcept 有什么意义吗?
Is there any point in declaring a deleted function as noexcept?
考虑 class 的这两个可能的定义:
图表 A:
struct A
{
A() = delete;
};
图表 A′:
struct A
{
A() noexcept = delete;
}
将已删除的函数声明为 noexcept
有什么意义吗?
(最初作为评论发布,但鼓励 post 作为答案。)
简单地说,没有。不能调用被删除的函数(或者,在构造函数的情况下,用于初始化对象)更不用说抛出异常了。
编辑:
hvd 在下面的评论中提到 noexcept(f())
没有调用 f()
。如果classA
的构造函数是delete
d,那么noexcept(A())
就会编译失败,不管是否声明了noexcept
构造函数。这(本质上)是要求 noexcept(expression)
被赋予有效表达式的结果 - 而 class A
的表达式 A()
需要有效的构造函数。
Revolver_Ocelot 也正确地指出不可能在 noexcept
上重载(即不可能有两个具有相同签名的函数,除了一个是 noexcept
而一个不是)。因此,在 class A
的定义中,A() = delete
和 A() noexcept = delete
都具有相同的效果,即 class A
没有非参数构造函数。
考虑 class 的这两个可能的定义:
图表 A:
struct A
{
A() = delete;
};
图表 A′:
struct A
{
A() noexcept = delete;
}
将已删除的函数声明为 noexcept
有什么意义吗?
(最初作为评论发布,但鼓励 post 作为答案。)
简单地说,没有。不能调用被删除的函数(或者,在构造函数的情况下,用于初始化对象)更不用说抛出异常了。
编辑:
hvd 在下面的评论中提到 noexcept(f())
没有调用 f()
。如果classA
的构造函数是delete
d,那么noexcept(A())
就会编译失败,不管是否声明了noexcept
构造函数。这(本质上)是要求 noexcept(expression)
被赋予有效表达式的结果 - 而 class A
的表达式 A()
需要有效的构造函数。
Revolver_Ocelot 也正确地指出不可能在 noexcept
上重载(即不可能有两个具有相同签名的函数,除了一个是 noexcept
而一个不是)。因此,在 class A
的定义中,A() = delete
和 A() noexcept = delete
都具有相同的效果,即 class A
没有非参数构造函数。