首页 > 解决方案 > 将函数调用表达式传递给 noexcept 有什么意义?

问题描述

这有什么区别:

bool foo(int){return 0;}
void bar()noexcept(foo){}

void bar()noexcept(foo(10)){}

标签: c++exceptionnoexcept

解决方案


这有什么区别:

bool foo(int){return 0;}
void bar()noexcept(foo){}

void bar()noexcept(foo(10)){}

区别不是很重要,因为两者都是不正确的。但是,让我们看看为什么会这样:

First 格式不正确,因为当foo上下文转换为 时bool,它将首先隐式转换为指向函数的指针。尽管指针总是指向 fo foo,因此结果总是正确的,但这种转换不是常量表达式,因此在noexcept规范中是不允许的。

Second 格式不正确,因为foo它不是 constexpr 函数,因此它可能不会在noexcept规范中调用。


但是第二个版本noexcept(noexcept(foo(10)))呢?

noexcept(foo(10))如果表达式调用的函数foo(10)可能抛出异常,则为 false,如果为 noexcept,则为 true。因此,这实现了异常规范的“复制”。当在函数中使用有问题的表达式时,几乎总是这样做:

void bar() noexcept(noexcept(foo(10))) {
    bool example = foo(10);
}

推荐阅读