默认情况下,继承的构造函数是否为noexcept(true)?

5
我在这里发现:链接

继承构造函数[...] 默认情况下都是 noexcept(true),除非它们需要调用一个 noexcept(false) 的函数,这种情况下,这些函数就会变成 noexcept(false)。

这是否意味着在以下示例中,即使基类中已明确定义为 noexcept(false),继承的构造函数也被视为自己要调用的 一个 noexcept(false) 的函数,因此是 noexcept(true)
struct Base {
    Base() noexcept(false) { }
};

struct Derived: public Base {
    using Base::Base;
};

int main() {
    Derived d;
}
1个回答

4
继承的构造函数也将是noexcept(false),因为正如你所引用的,继承的构造函数默认情况下会是noexcept(true),除非需要调用一个noexcept(false)的函数。
当运行Derived构造函数时,它也会调用Base构造函数,Base构造函数是noexcept(false)的,因此,Derived构造函数也将是noexcept(false)
以下是证明。
#include <iostream>

struct Base {
  Base() noexcept(false) { }
};

struct Derived: public Base {
  using Base::Base;
};

int main() {
  std::cout << noexcept(Derived());
}

输出 0。

我认为该网站上的文档部分相当不清晰... 不过,它还是有意义的。 - skypjack

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