gpt4 book ai didi

c++ - Noexcept 对派生类构造函数的 promise : can that be used without promising noexcept on base constructor?

转载 作者:可可西里 更新时间:2023-11-01 16:38:04 32 4
gpt4 key购买 nike

假设我有一个类

class C : public B {
public:
C() noexcept;
}

noexcept 说明符是否需要基类的相同 promise ?也就是说,当我考虑使用 noexcept 时,我是只看 C::C() 的行为还是我还需要考虑 B::B() 是否可能抛出异常?

例如,如果 B::B 抛出异常,它会传播到 C::C 还是传播到请求新类实例的代码? -- 如果传播到 C::C,如果基类不是 noexcept for constructor,那将是避免 noexcept for constructor 的原因之一。

最佳答案

技术上不要求将基类构造函数声明为 noexcept,但当由声明为 noexcept 的派生构造函数调用时,它不得抛出异常。

所以是的,您确实需要考虑基类构造函数是否可能抛出(异常或其他)。

I guess a better way of asking my question is: where does the exception go next?

调用流程如下:

caller
-> derived constructor (the noexcept applies to this)
-> subobject constructors (includes bases)
- derived constructor body (not a call, but part of the derived constructor that is executed after the subobjects are constructed)

因此,如果子对象(无论是基类还是成员)构造函数抛出异常,它首先会转到派生构造函数,派生构造函数不会也不能††吞下异常,所以如果构造函数不是 noexcept,它将传播给调用者。但既然是这样,就会调用 std::terminate

如果基类确实没有按照派生类的要求抛出异常,那么它确实满足要求并且可以将其本身声明为 noexcept,因此很少有理由不这样做。也许,如果基类是必须支持 c++03 的库的一部分,而派生类可能采用更高版本的标准,那将是有意义的。

††它可以用函数 try block 捕获,但它们总是会再次抛出。

关于c++ - Noexcept 对派生类构造函数的 promise : can that be used without promising noexcept on base constructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36704630/

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