В книге Язык программирования C ++ написано, что вы можете объявить функцию условно noexcept
. Например:
template<typename T>
void my_fct(T& x) noexcept(std::is_pod<T>::value);
noexcept
принимает предикат, который должен быть постоянным выражением (в примере std::is_pod<T>::value
).
Однако в книге также написано:
Оператор noexcept()
принимает выражение в качестве аргумента и возвращает true
, если компилятор знает, что он не может выдать, и false
в противном случае.
Принимая это в учтите, что
constexpr bool f() { return true; }
void g() noexcept(f())
{
f();
}
g()
помечен как noexcept
или нет? Я вижу две возможности:
- Вызов
f()
оценивается во время компиляции, потому что он помечен constexpr
, он возвращает true
и в результате g()
помечается noexcept
. - Компилятор не может определить, что
f()
не может выдать исключение, поскольку f()
не помечено noexcept
. В результате g()
не помечается noexcept
.
Что происходит? Как выбрать то или иное поведение для noexcept
?