返回一个具有抛出析构函数的类的函数的noexcept

6
在以下代码中,我认为断言不应该触发,但实际上它确实触发了。
struct A
{
  ~A() noexcept(false);
};

A f() noexcept;

int main()
{
  static_assert(noexcept(f()), "f must be noexcept");
}

函数f()明显是不抛出异常的,但是noexcept(f())在gcc和clang中都会返回false(即noexcept失败)。

我是否漏掉了什么或者这是一个bug?

1个回答

4
对于表达式e上的noexcept运算符,它告诉你该表达式的潜在异常集是否为空。根据[except.spec] /(13.2)规定,此集包含析构函数的潜在异常:

如果e隐式调用了一个或多个函数(例如重载运算符、new-expression中的分配函数或e为完整表达式(1.9)时的析构函数),则S为以下各项的总和:[...] 所有这些函数异常说明中的类型集合


这是在 C++17 草案中吗?我在 C++14 标准中找不到你的部分。 - Simple
@Simple:是的,它是从头开始的。好问题,我不知道这最后一次改变是什么时候。 - Kerrek SB
@Simple:看起来这个措辞是作为CWG 1992的解决方案的一部分添加的,该方案在2016年2月的会议上被接受为缺陷报告。作为一个缺陷意味着这个问题可以被追溯地修复到所有以前的版本,因为它基本上捕捉了应该一直存在的含义。 - Kerrek SB
标准的版本并不重要;noexcept 始终包括由表达式显式或隐式调用的所有内容。 - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接