gpt4 book ai didi

c++ - g++-4.8.1 认为显式声明的没有异常规范的析构函数总是 noexcept(true)

转载 作者:IT老高 更新时间:2023-10-28 22:22:02 26 4
gpt4 key购买 nike

考虑以下程序:

#include <type_traits>

struct Thrower
{
~Thrower() noexcept(false) { throw 1; }
};

struct Implicit
{
Thrower t;
};
static_assert(!std::is_nothrow_destructible<Implicit>::value, "Implicit");

struct Explicit
{
~Explicit() {}

Thrower t;
};
static_assert(!std::is_nothrow_destructible<Explicit>::value, "Explicit");

使用g++-4.8.1Explicit上出现静态断言失败——似乎认为~Explicit()noexcept。这不符合我的期望。根据§12.4.3:

A declaration of a destructor that does not have an exception-specification is implicitly considered to have the same exception-specification as an implicit declaration

这里有趣的是 Implicit 的检查似乎是根据我对 §15.4.14 的解释(通过 §12.4.7)进行的。

...If f is an...destructor...it's implicit exception-specification specifies...f has the exception-specification noexcept(true) if every function it directly invokes allows no exceptions.

g++-4.7 缺少 is_nothrow_destructable,我编写了自己的代码来检查 4.7 中的行为。该程序似乎编译得很好。我保留完全错误的权利和我困惑的根源:

template <typename T>
struct is_nothrow_destructible
{
static constexpr bool value = noexcept(std::declval<T>().~T());
};

TL;DR:为什么g++-4.8.1认为显式声明的没有异常规范的析构函数总是 noexcept(true)?


更新:我打开了一个错误:57645 .如果你真的需要解决这个问题,你可以在析构函数中添加一个异常规范(就像示例中的 Thrower 一样)。

最佳答案

TL;DR: Why does g++-4.8.1 think that an explicitly-declared destructor with no exception specification is always noexcept(true)?

因为它有错误?

您对标准的解释是正确的,并且 Clang 正确地实现了它(断言不会触发)。

f has the exception-specification noexcept(true) if every function it directly invokes allows no exceptions.

析构函数直接调用所有子对象的析构函数:

§12.4 [class.dtor] p8:

After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct non-variant non-static data members, [...].

关于c++ - g++-4.8.1 认为显式声明的没有异常规范的析构函数总是 noexcept(true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com