【发布时间】:2020-06-12 17:38:30
【问题描述】:
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 选择一种或其他行为?
【问题讨论】: