初期化子リストから飛んでくる例外を捕まえる

#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(...){
    // ここは単に例外を握りつぶしてるだけ
  }
}

とりあえず第一感は「こんな構文あったのね」