#include <iostream>
#include <exception>
struct X
{
X(){ std::cout << "X::ctor" << std::endl; }
~X(){ std::cout << "X::dtor" << std::endl; }
};
struct Y
{
Y()
{
std::cout << "Y::ctor (throws an exception)" << std::endl;
throw std::exception();
}
~Y(){ std::cout << "Y::dtor" << std::endl; }
};
struct Z
{
Z()
try // 初期化子リストから飛んでくる例外をキャッチ
: x(),
y() // ここから例外が飛んでくる
{ /*ここがコンストラクタの本体*/ }
catch(...){
// 初期化子リストで例外が投げられるとここにコントロールが移る.
// ここにコントロールが移る時点ですでに初期化子リストで構築された
// オブジェクト(この例ではx)に対してはデストラクタが呼ばれている.
std::cout
<< "Z::ctorの初期化子リストで投げられた例外を捉えました"
<< std::endl;
throw;
}
X x;
Y y;
};
int main()
{
try{
Z z;
}
catch(...){
// ここは単に例外を握りつぶしてるだけ
}
}とりあえず第一感は「こんな構文あったのね」.