c++ - 将函数调用表达式传递给 noexcept 有什么意义?
问题描述
这有什么区别:
bool foo(int){return 0;}
void bar()noexcept(foo){}
和
void bar()noexcept(foo(10)){}
第一个
bar
具有相同的异常规范,foo
而后者可能会抛出,因此两者等效于noexcept(false)
. 但是第二个版本呢:noexcept(noexcept(foo(10)))
?这两个声明是否相同?
解决方案
这有什么区别:
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);
}
推荐阅读
- javascript - 清除后如何继续setinterval功能
- c - 使用线程写入文件(WINAPI)
- javascript - 如何在最小值、最大值上使用小数百分比格式化 Google Chart Gauge?
- dropbox - Dropbox API - 创建文件夹时添加文件夹概览
- spring-boot - 为什么hibernate在初始化的子句中执行sql
- spring-boot - MockMvc 测试总是为获取请求返回状态码 200
- ansible - 在 Ansible 中使用 Jinja 模板需要帮助
- c# - 如何保存多个用户创建的复选框?时间:2019-04-10 标签:c#wpf
- azure-active-directory - 待办事项 API:服务不可用
- collision - 如果重叠则弹出阻塞对象:UE4