【发布时间】:2021-12-15 19:26:11
【问题描述】:
这有什么区别:
bool foo(int){return 0;}
void bar()noexcept(foo){}
和
void bar()noexcept(foo(10)){}
-
在第一个
bar与foo具有相同的异常规范,而后者可能会抛出,因此两者等效于noexcept(false)。但是第二个版本呢:noexcept(noexcept(foo(10)))? -
这两个声明是否相同?
【问题讨论】:
-
好吧,两者都应该发出编译器诊断,因为
foo不能隐式转换为bool和foo(10)不是文字表达式(除非您将foo标记为 @ 987654331@)。我错过了什么吗?你的意思是问noexcept(noexcept(foo(10))吗? -
@Brian:我认为这里的返回类型或值无关紧要,当涉及到传递给
noexcept的表达式时:void f(double){} void bar() noexcept(noexcept(f(.14))){}将编译尽管f(3.14)返回void.因为它没有被评估。 -
noexcept(f(10))和noexcept(noexcept(f(10)))是非常不同的东西 -
就
noexcept(foo)...而言,它并没有像您认为的那样。它所做的只是将foo转换为布尔值。函数名总是衰减到有效地址,所以额外的布尔转换总是到true。该规范是一个普通的noexcept,带有额外的步骤。 -
@StoryTeller-UnslanderMonica:是的,第一个计算表达式,它必须是 constexpr,但后者不是。我想知道:
noexcept(foo) and noexcept(noexcept(foo))之间有什么区别?我的意思是这里的函数调用是多余的吗?