按值传递参数时异常在哪里抛出

Mar*_*hrs 5 c++ exception pass-by-value language-lawyer noexcept

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

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

void doit(A)
{
}

int main()
{
    A a;
    doit(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 6

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

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

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