2013-03-14

Boost 1.52.0のboost::result_ofに注意

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を実装していないコンパイラーの場合は、従来の実装が使われるので、とりあえず既存のコードが壊れるという事はないそうだ。

No comments: