gpt4 book ai didi

c++ - noexcept(false) 析构函数覆盖所有特殊成员函数的异常规范?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:06 26 4
gpt4 key购买 nike

考虑这个类 T

struct T{ 
T() noexcept (true) {}
T(T&& ) noexcept (true) {}
T(const T& ) noexcept (true) {}

T& operator = (T&&) noexcept(true) { return *this; }
T& operator = (const T&) noexcept(true) { return *this; }

~T() noexcept(false) {}
};

考虑这个简单的测试程序:

int main(){
constexpr bool default_ctor = noexcept(T());
static_assert(default_ctor == true, "Default Constructor can throw exceptions");

constexpr bool move_ctor = noexcept(T(std::declval<T>())); //Move ctor
static_assert(move_ctor == true, "Move Constructor can throw exceptions");

constexpr bool copy_ctor = noexcept(T(std::declval<T&>())); //Copy ctor
static_assert(copy_ctor == true, "Copy Constructor can throw exceptions");

constexpr bool move_assign = noexcept(std::declval<T>() = std::declval<T>());
static_assert(move_ctor == true, "Move Assignment can throw exceptions");

constexpr bool copy_assign = noexcept(std::declval<T&>() = std::declval<const T&>());
static_assert(copy_ctor == true, "Copy Assignment can throw exceptions");


//It doesn't matter when using *`type_traits`* either. Same behavior:
constexpr bool no_throw_cons = std::is_nothrow_constructible<T>::value;
static_assert(no_throw_cons == true, "Default Constructor isn't nothrow");
//...others skipped for brevity
}

这里的每一个 static_assert 都会触发。这不应该按照我从标准中理解的那样:

但是,当您在没有异常规范的情况下声明 T 的析构函数时(与此简单上下文中的 noexcept(true) 相同),所有断言都会通过!


但是,运行时遵守规范:

struct T{ 
T() noexcept (true) { throw int(8); }
//.... there rest omitted for brevity
~T() noexcept(false) {}
};

int main(){
T a;
(void)a;
};

std::terminate 按预期调用。


C++ 标准中是否有任何部分定义或暗示了这种行为?析构函数上的 noexcept (false) 说明符仅在编译时覆盖每个特殊成员函数的异常说明?

或者这是每个主要编译器中的前端错误。

最佳答案

在您的第一个测试中,您要询问完整表达式 T() 是否可以抛出异常。该表达式构造一个 T 然后再次销毁它。因此,如果析构函数可以抛出异常,那么该表达式也可以。

关于c++ - noexcept(false) 析构函数覆盖所有特殊成员函数的异常规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39279564/

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