noexcept 的不同用途

Different uses of noexcept

The C++ Programming Language一书中写道,您可以有条件地声明一个函数noexcept。例如:

template<typename T>
void my_fct(T& x) noexcept(std::is_pod<T>::value);

noexcept 采用必须是常量表达式的谓词(在示例 std::is_pod<T>::value 中)。

不过书上也写着:

The noexcept() operator takes an expression as its argument and returns true if the compiler knows that it cannot throw and false otherwise.

考虑到这一点,考虑:

constexpr bool f() { return true; }

void g() noexcept(f())
{
    f();
}

g() 是否标记为 noexcept?我看到两种可能性:

  1. 调用 f() 在编译时被评估,因为它被标记为 constexpr,它 returns true 并且结果 g() 被标记noexcept.
  2. 编译器无法确定f()不能抛出异常,因为f()没有被标记为noexcept。结果 g() 没有被标记为 noexcept.

哪一个发生了?我如何 select noexcept 的一种或其他行为?

语言语法只允许 noexcept 说明符 出现在该位置。

因此你的第一点是正确的。 g()会被标记为noexcept,因为f()returnstrue.

noexcept 运算符 必须出现在表达式中。 noexcept 说明符将表达式作为参数,因此如果要根据某个表达式是否为 noexcept 使函数为 noexcept,则必须编写:

void g() noexcept(noexcept(f()))
{
    f();
}

这将根据您的第二点表现。

Which one does happen?

1.

How can I select one or other behavior for noexcept?

使用上下文。函数声明是唯一使用谓词含义的上下文。

如果要在 noexcept 谓词中使用 noexcept 运算符,需要这样写:

void g() noexcept(noexcept(f()))