gpt4 book ai didi

c++ - noexcept 的不同用途

转载 作者:行者123 更新时间:2023-12-01 14:03:48 25 4
gpt4 key购买 nike

在 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或不?我看到两种可能性:
  • 来电f()在编译时计算,因为它被标记为 constexpr ,它返回 true结果 g()被标记 noexcept .
  • 编译器无法确定 f()不能抛出异常,因为 f()未标记 noexcept .结果g()未标记 noexcept .

  • 哪一种会发生?如何为 noexcept 选择一种或其他行为?

    最佳答案

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

    因此你的第一点是正确的。 g()将被标记 noexcept , 因为 f()返回 true .
    noexcept运算符必须出现在表达式中。 noexcept说明符接受一个表达式作为参数,所以如果想要一个函数是 noexcept取决于某个表达式是否为noexcept ,必须写:

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

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

    关于c++ - noexcept 的不同用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60454726/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com