Visual C++ 2010 の C++0x 対応状況チェック

色んなコンパイラC++0x をサポートし始めているが、VC++ もご多分に漏れずサポートを始めている。
そんなわけで、VC++ 2010 の C++0x 対応状況を調べてみた。
全仕様を把握しているわけではないので、足りないものがあったらつっこんで欲しい。

実装済

  • auto 変数宣言
  • decltype
  • ラムダ式
    ただし、ラムダ式から関数ポインタへの変換はできない。提案時期が時期なので実装が中途半端の方には入れないでおく
  • 右辺値参照
  • ムーブコンストラクタ、ムーブ代入演算子
  • スマートポインタ(std::unique_ptr, std::shared_ptr, std::weak_ptr)
  • nullptr
    ただし、NULLは相変わらず0で定義されている。ただ、NULLの定義は処理系定義なので、別に規格違反ではない(不親切だが)
  • long long
  • テンプレート引数の括弧の連続記述
    std::vector<std::vector<int>> v; など
  • enum-base
    enum A : short { a }; など
  • static_assert
  • trailing return type
    auto foo() -> int { return 0; } など
  • 可変個引数マクロ
  • cstdint, initializer_list, typeindex, forward_list, system_error ヘッダ

実装が中途半端

  • new auto
    バグあり → https://connect.microsoft.com/VisualStudioJapan/feedback/details/555754/
  • リスト初期化
    std::initializer_list クラステンプレートは定義されているが、
    std::vector<int> v = { 1, 2, 3 }; のように使う事は出来ない
    std::pair<int, int> p { 1, 2 }; や
    return std::pair<int, int> foo() { return { 1, 2 }; } などもできない
  • char16_t, char32_t
    型は存在するが、typedef してるだけ。キーワードではないし、キーワード化もできない。cuchar ヘッダもないし、本当に型があるだけという感じ
  • tuple, type_traits, unordered_map, unordered_set, random, regex ヘッダ
    std::tr1 名前空間内に定義されている
    tuple とか可変個テンプレート引数が実装されてないのでそもそも規格準拠不可能

未実装

  • = default
  • = delete
  • constexpr
  • range-based for
    for (int x: array) { ... } など。所謂 foreach
  • enum class
    enum class A { a }; A a = A::a; など
  • raw string literal
  • 属性
  • alignof
  • noexcept
  • ユーザ定義リテラル
  • コンストラクタの委譲呼び出し
    struct Point { Point(int x, int y) : x(x), y(y) {} Point() : Point(0, 0) {} int x, y; }; など
  • コンストラクタ継承
    struct A { A(int n); }; struct B : A { using A::A; }; B b(2); など
  • 可変個テンプレート引数
  • cstdbool, ratio, chrono, cuchar, ctgmath, cinttypes, atomic, thread, mutex, condition_variable, future ヘッダ


規格準拠率(といってもまだ規格として成立していないが)はかなり低いが、実装されている仕様はおそらく実装の優先順位が高いと判断されたものなのだろうし、逆に、C99 をガン無視してた割に C++0x サポートに前向きなのは、それらを実装したかったからなのかなあと思ったり。
C++0x はあまり広まらないと思ってたけど、意外と使われるようになるかもしんない。


range-based for、constexpr、コンストラクタの委譲呼び出し、コンストラクタ継承、= default、= delete あたりが実装されてないのはちょっと意外だった。
可変個テンプレート引数が実装されてないのはある意味予想通りだが、可変個引数マクロに対応してるのはちょっと意外。
ユーザ定義リテラルに至ってはそもそも規格として採用されるのか心配するところから始めないといけない。
ラムダ式のついでに実装したと思われる trailing return type だけど、これも本当に採用されるのかな?