Являются ли наследующие конструкторы noexcept(true) по умолчанию?

Здесь я обнаружил, что:

Все наследующие конструкторы [...] по умолчанию являются noexcept(true), если только они не обязаны вызывать функцию noexcept(false), и в этом случае эти функции noexcept(false).

Означает ли это, что в следующем примере унаследованный конструктор noexcept(true)хотя он был явно определен как noexcept(false) в базовом классе, или он рассматривается как функция, которая вызывается noexcept(false)?

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

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

int main() {
    Derived d;
}

1 ответ

Решение

Унаследованный конструктор также будет noexcept(false) потому что, как вы цитировали унаследованный конструктор будет noexcept(true) по умолчанию

если они не обязаны вызывать функцию noexcept (false)

Когда Derived конструктор запускает также вызовет 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.

Другие вопросы по тегам