noexcept функции, возвращающей класс, имеющий бросающий деструктор

В следующем коде я думал, что утверждение не должно срабатывать, но оно срабатывает.

struct A
{
  ~A() noexcept(false);
};

A f() noexcept;

int main()
{
  static_assert(noexcept(f()), "f must be noexcept");
}

Функция f() не является очевидной, но noexcept(f()) оценивается как ложная. (как в gcc, так и в clang)

Я что-то упустил или это баг?


person Inbae Jeong    schedule 21.03.2016    source источник


Ответы (1)


Оператор noexcept в выражении e указывает, пусто ли набор потенциальных исключений выражения. Этот набор содержит потенциальные исключения деструктора согласно [except.spec]/(13.2):

Если e неявно вызывает одну или несколько функций (например, перегруженный оператор, функцию распределения в новом выражении или деструктор, если e — полное выражение (1.9)), S является объединением: [...] наборов типов в спецификациях исключений всех таких функций

person Kerrek SB    schedule 21.03.2016
comment
Это черновик С++ 17? Я не могу найти ваш проход в стандарте С++ 14. - person Simple; 21.03.2016
comment
@Simple: Да, это из головы. Хороший вопрос, я не знаю, когда это в последний раз менялось. - person Kerrek SB; 21.03.2016
comment
@Simple: похоже, формулировка была добавлена ​​как часть резолюции CWG 1992, которая была принята как Дефект. Доклад на собрании в феврале 2016 года. Однако наличие дефекта означает, что проблема может быть исправлена ​​задним числом для всех предыдущих версий, поскольку она по существу отражает то, что должно было всегда иметь в виду. - person Kerrek SB; 21.03.2016
comment
Версия стандарта не имеет значения; noexcept всегда включает все, что явно или неявно вызывается выражением. - person T.C.; 21.03.2016