【问题标题】:Where are exceptions thrown when arguments are passed by value [duplicate]按值传递参数时抛出的异常在哪里[重复]
【发布时间】:2020-07-06 11:47:16
【问题描述】:

复制时我有一个类型抛出:

struct A { A(const A&) { throw 1; } };

void doit(A)
{
}

int main()
{
    A a;
    doit(a);
    return 0;
}

异常是在函数内部还是外部抛出?我可以将函数声明为 noexcept 吗?

【问题讨论】:

标签: c++ exception language-lawyer pass-by-value noexcept


【解决方案1】:

参见 C++17 [expr.call]/4

...每个参数的初始化和销毁​​发生在上下文中 调用函数。 [ 示例: 在调用函数的调用点检查构造函数、转换函数或析构函数的访问。如果函数参数的构造函数或析构函数抛出异常,则在调用函数的范围内开始搜索处理程序;特别是,如果被调用的函数有一个 function-try-block(第 18 条)和一个可以处理异常的处理程序,则该处理程序不是 经过考虑的。 — 结束示例 ]

因此,正如您所说,异常是“在函数之外”抛出的。你可以声明它noexcept

【讨论】:

  • 对于那些认为这个答案有帮助的人。另请参阅我不久前提出的关于 copy-ellision and noexcept 的另一个问题。它相关但不相等。
猜你喜欢
  • 2016-03-10
  • 2013-02-08
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
相关资源
最近更新 更多