【问题标题】:Is there any point in declaring a deleted function as noexcept?将已删除的函数声明为 noexcept 有什么意义吗?
【发布时间】:2016-11-11 18:33:05
【问题描述】:

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

展览 A:

struct A
{
    A() = delete;
};

图 A′:

struct A
{
    A() noexcept = delete;
}

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

【问题讨论】:

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

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


【解决方案1】:

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

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

编辑:

hvd 在下面的 cmets 中提到 noexcept(f()) 不调用 f()。如果A类的构造函数是deleted,那么noexcept(A())将编译失败,不管构造函数是否声明为noexcept。这(本质上)是要求为noexcept(expression) 提供有效表达式的结果 - 并且A 类的表达式A() 需要有效的构造函数。

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

【讨论】:

  • noexcept 不仅仅影响函数调用。没错,如果无法调用函数,则不会影响函数调用。但是noexcept 通常可以在不调用任何东西的情况下产生影响,最明显的是通过noexcept 运算符(noexcept(f()) 不会调用f())。我认为一个好的答案还应该解释为什么其他情况都不适用(例如,如果所有其他情况只适用于可调用函数,它们不适用于已删除的函数),或者是否有可能(我怀疑它不是),举个反例。
  • 提及您不能在noexcept 上超载(不像const)也会有所帮助。
  • 你说得对,hvd 和 Revolver_Ocelot。我已经编辑了答案以合并(或响应)您的两个 cmets。 “不”的简单答案仍然适用,您每个人指出的其他信息都支持这一点。
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 2016-04-10
  • 2021-01-02
  • 1970-01-01
  • 2014-07-08
  • 2015-01-12
  • 1970-01-01
相关资源
最近更新 更多