A Special Note for Boost 1.52.0 and Higher
Boost 1.52.0のboost::result_ofの実装は、decltypeを使うものに切り替わった。
簡単に言うと、現在、Boost 1.52.0のboost::result_ofが正しく動作するコンパイラーは、Clang 3.1のみとなる。MSVCはおろか、GCCさえ動かない。
これは、decltypeのN3276による変更を実装しているコンパイラーがClangだけなことによるものだ。
TR1のresult_ofは、もともとdecltypeが存在しない環境で実装されていたため、現行の正式なC++11規格のdecltypeを使う実装とはだいぶ異なったものになっていた。さらに、関数の戻り値の型は完全型でなければならないという大昔のルール(prvalueのためのストレージを確保する必要があり、不完全型では困る文脈)が、decltype内でも適用される(別にオブジェクトのサイズが決められなくてもかまわない文脈)ことが問題になった。Boost 1.52.0では、result_ofをC++11規格に合わせたため、しばらくはClangしかまともにresult_ofが動かないということになった。
規格準拠のdecltypeを実装していないコンパイラーの場合は、従来の実装が使われるので、とりあえず既存のコードが壊れるという事はないそうだ。
@ezoeryou これはBoost.Configが提供する BOOST_NO_CXX11_DECLTYPE_N3276 を見て挙動を変えるのでn3276 decltypeを持ってないコンパイラは従来通りになります
— にゃははー (@Flast_RO) March 14, 2013
No comments:
Post a Comment