Visual Studio 2012 に C++11 の機能が追加されるらしい

Visual Studio 2012 に新しい C++11 の機能が追加される(された?)らしいので試してみました。
今回実装されたのは下記の機能です。

  • Variadic templates
  • Uniform initialization and initializer_lists
  • Delegating constructors
  • Raw string literals
  • Explicit conversion operators
  • Default template arguments for function templates

だいぶいい感じの機能が実装されているみたいですね。
Variadic Templates や InitializerList は喉から手が出るほど欲しかった機能。
Default template arguments も地味に嬉しい。

[導入方法]

導入するにあたり予め Visual Studio 2012 をインストールしておく必要があります。
(わたしは Visual Studio 2012 Desktop Express で試しました。
Visual Studio を導入したらこちらからパッチを落としてきてインストールします。
インストール後に Visual Studio を立ちあげて、

  • 1.プロジェクトのプロパティ
  • 2.[全般]→[プラットフォーム ツールセット]を選択
  • 3.Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov)' を選択
  • 4.プロジェクトをリビルド

で使用することが出来るようになります。


[ソース]

#include <iostream>
#include <vector>
#include <initializer_list>
#include <string>

struct X{
    std::string name;
    int age;
};

template<typename ...Args>
void
disp(Args... args){
    for(auto&& n : std::initializer_list<int>{args...}){
//  for(auto&& n : {args...}){
        std::cout << n << std::endl;
    }
}

int
main(){
    std::initializer_list<int> v = {1, 2, 3, 4, 5};
    for(auto&& n : v){
        std::cout << n << std::endl;
    }

    disp(6, 7, 8, 9, 10);
//  std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    X x{"homu", 14};
    std::cout << x.name << std::endl;
    std::cout << x.age  << std::endl;

    return 0;
}

[出力]

1
2
3
4
5
6
7
8
9
10
homu
14


上記のコードは問題なくコンパイルでき、実行することが出来ました!やった!!
まだ標準ライブラリ周りは未対応なのか std::vector に initializer_list は渡せませんでしたが、Variadic Templates なんかが使えるのが大きいですね。
これは今後にも期待できそうですね!


…で、constexpr が実装されるのはいつなんでしょうか?