throw-expressionsとcopyコンストラクターについて質問があります。
#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-expressionで、オペランドが不揮発性の自動オブジェクト(関数またはcatch-clauseパラメーターを除く)の名前であり、そのスコープが最も内側の囲んでいるtry-blockの終わりを超えない場合(存在する場合)、オペランドから例外オブジェクト(15.1)へのコピー/移動操作は、自動オブジェクトを例外オブジェクトに直接構築することで省略できます。