【问题标题】:What is point in passing a function call expression into noexcept?将函数调用表达式传递给 noexcept 有什么意义?
【发布时间】:2021-12-15 19:26:11
【问题描述】:

这有什么区别:

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

void bar()noexcept(foo(10)){}
  • 在第一个barfoo 具有相同的异常规范,而后者可能会抛出,因此两者等效于noexcept(false)。但是第二个版本呢:

    noexcept(noexcept(foo(10)))?

  • 这两个声明是否相同?

【问题讨论】:

  • 好吧,两者都应该发出编译器诊断,因为 foo 不能隐式转换为 boolfoo(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)) 之间有什么区别?我的意思是这里的函数调用是多余的吗?

标签: c++ exception noexcept


【解决方案1】:

这有什么区别:

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

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

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

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

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


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多