Visual Studio 2013 を試してみた

先日 Visual Studio 2013 がリリースされたということなので C++11 的な意味で試してみました。
Visual Studio 2013 では以下の C++11 の機能が新しく実装されました。

  • Non-static data member initializers
  • Variadic templates
  • Initializer lists
  • Default template arguments for function templates
  • Alias templates
  • Delegating constructors
  • Explicit conversion operators
  • Raw string literals
  • Defaulted and deleted functions

http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx

[ソース]

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

// Variadic templates
template<typename... Args>
void
func(Args... args){
    // Initializer lists
    for(auto&& n : { args... }){
        std::cout << n << std::endl;
    }
}

template<typename T>
struct X{
    T value;
    X(int n) : value(n){}
};

struct person{
    // Non-static data member initializers
    int age = 13;
    std::string name = "homu";
};


// Aliases templates
template<typename T>
using my_vector = std::vector<X<T>>;

int
main(){
    std::cout << _MSC_VER << std::endl;

    // Initializer lists
    my_vector<int> v = { X<int>{1}, X<int>{2}, X<int>{3}};
    for(auto&& n : v){
        std::cout << n.value << std::endl;
    }

    func(1.1, 2.2, 3.3, 4.4, 5.5);

    person homu;
    std::cout << homu.name << std::endl;
    std::cout << homu.age << std::endl;

    return 0;
}

[出力]

1800
1
2
3
1.1
2.2
3.3
4.4
5.5
homu
13


Visual Studio 2012 とはなんだったのか…という勢いで C++11 の機能が実装されていますね。
Variadic templatesInitializer listsNon-static data member initializers あたりが入ってやっとまともに C++ のコードが書けそうです。
Alias templatesDefault template arguments for function templatesRaw string literals も地味に嬉しいですね。


あとメジャーな機能で実装されていないのは constexprInheriting constructorsUser-defined literalsconstexpr constexpr でしょうか。
C++14 も視野に入っているようなので次が楽しみですね。