【问题标题】: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。