【问题标题】:Different uses of noexceptnoexcept 的不同用途
【发布时间】: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&lt;T&gt;::value)。

不过,书中也写着:

noexcept() 运算符将表达式作为其参数,并且 如果编译器知道它不能抛出,则返回 truefalse 否则。

考虑到这一点,请考虑:

constexpr bool f() { return true; }

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

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

  1. 调用f() 在编译时进行评估,因为它被标记为constexpr,它返回true,结果g() 被标记为noexcept
  2. 编译器无法确定f() 不能引发异常,因为f() 未标记为noexcept。因此,g() 未标记为 noexcept

发生了什么?如何为noexcept 选择一种或其他行为?

【问题讨论】:

    标签: c++ c++11 noexcept


    【解决方案1】:

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

    因此,您的第一点是正确的。 g() 将被标记为noexcept,因为f() 返回true

    noexcept 运算符 必须出现在表达式中。 noexcept 说明符接受一个表达式作为参数,所以如果想要有一个函数是noexcept,这取决于某个表达式是否为noexcept,必须这样写:

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

    这将根据您的第二点进行。

    【讨论】:

    【解决方案2】:

    会发生哪一个?

    1.

    如何为 noexcept 选择一种或其他行为?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 2019-04-09
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多