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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.