我有一个关于抛出表达式和复制构造函数的问题。
#include <iostream>
class Foo
{
public:
Foo() { std::cout << "Foo::Foo() \n"; }
Foo(const Foo&) { std::cout << "Foo::Foo(const Foo&) \n"; }
~Foo() { std::cout << "Foo::~Foo() \n"; }
};
int main()
{
try
{
throw Foo();
}
catch (...)
{
std::cerr << "Error \n";
}
}
在 C++98 / C++03 中,此代码是否打印:
Foo::Foo()
Error
Foo::Foo(const Foo&)
Foo::~Foo()
在 C++11 中,以下之一:
Foo::Foo()
Error
Foo::Foo(const Foo&)
Foo::~Foo()
或者
Foo::Foo()
Error
Foo::~Foo()
我只在 C++11 中看到了这一点:
12.8 复制和移动类对象[class.copy]
31 ... — 在 throw 表达式中,当操作数是非易失性自动对象(函数或 catch 子句参数除外)的名称时,其范围不超出最内层封闭 try 块的末尾(如果有的话),从操作数到异常对象(15.1)的复制/移动操作可以通过将自动对象直接构造到异常对象中来省略