2014年8月30日土曜日

MSVC2012はC++11のclass member initializationに未対応の模様

C++11からclass member initializationが導入されましたがMSVC2012は対応していない模様。

class member initializationはC++のクラスをはじめて触る人が必ずやる初期化でしょう。


・C++11

class C
{
  int x = 7; //これ
public:
  C();
};

メンバの宣言に初期化を定義することが出来、これによってクラスCのオブジェクトは全てx=7で初期化されることになります。これはC++11以前は以下のように記述する必要がありました。


・C++11以前


class C
{
  int x;
public:
  C() : x(7) {}
};

全てのコンストラクタで宣言しなければならないということと、、xの宣言と初期化が別の行に書かれることなどの理由からC++11でclass member initializationが導入されました。


しかしながらこのclass member initialization、MSVC2012は対応していない模様。

MSのドキュメントに詳しく記載されています。

Support For C++11 Features (Modern C++)

実際にC++Standardに従っているコンパイラはあまりないということでしょう。c++11対応といってもその機能の全てを網羅しているとは限らない。
リンク先の表を見てみると、よく使われる機能から順に実装されている様子。

class member initializationも2013から対応しています。

MSVC2012依存のプロジェクトはご注意を。



C++11のこういった機能の追加はコンパイラ技術の向上の賜物でしょう。C++の様々な非直感的な仕様は実はコンパイル時(構文解析時)の制約の為なのですが、だんだんと進歩していっているようです。

0 件のコメント:

コメントを投稿