Visual C++ Compiler November 2013 CTPがやってきた!
ソース http://blogs.msdn.com/b/vcblog/archive/2013/11/18/announcing-the-visual-c-compiler-november-2013-ctp.aspx
ついに…!ついに…!きた…!Visual C++ 2013 CTPです!
なんと、Visual C++で、constexprが使えます!!!(コンストラクタ除く)
コンパイラだけなので、インテリセンスやシンタックスハイライトやライブラリは更新しておらず対応していません。
CTPで実装された機能を紹介します。
C++11
- 暗黙のムーブコンストラクタ/ムーブ代入演算子の定義
- メンバ関数の参照修飾子
- 関数のstaticローカル変数のスレッドセーフな初期化
- 継承コンストラクタ
- alinas/alignof
- __func__
- 拡張sizeof
- constexpr(コンストラクタ、メンバ関数、リテラル型への修飾除く)
- noexcept(bool値を返す演算子機能除く)
アナウンスされていませんが地味に、decltypeからメンバ型にアクセスできるようになっています。((declype(v)::value_type
みたいなの。個人的にとても嬉しい))
C++14
- decltype(auto)
- 一般関数の戻り値のauto指定による型推論
- ジェネリックラムダ(汎用ラムダキャプチャー除く)
C++/CX
- (恐らくC++17で入るであろう) Resumable関数とawait
以下のコードがVisual C++で通ります!!
#include <iostream> using namespace std; constexpr int factorial(int n) noexcept { return n == 0 ? 1 : n * factorial(n - 1); } struct base { base(int, int){} }; struct hoge : base { using base::base; hoge(hoge&&) = default; hoge& operator=(hoge&&) = default; void func() & noexcept { cout << "func() & : " << __func__ << endl; } void func() && noexcept { cout << "func() && : " << __func__ << endl; } alignas(int) int value = 0; alignas(alignof(double)) char buf[sizeof(double)]; }; template <class T, class U> auto plus(T& t, U u)->decltype(auto) { auto f = [](auto& t, auto u)->int&{return t += u; }; return f(t, u); } int main() { static_assert(factorial(5) == 120, ""); static_assert(0U < sizeof(hoge::value), ""); hoge{1, 2}.func();// func() && : func [](auto i){cout << i << endl; }("str");// str [](auto&&... args){cout << sizeof...(args) << endl; }(1U, 2.1, nullptr, hoge{});// 4 int a = 2; int b = 3; decltype(auto) c = ::plus(a, b); ++c; cout << a << endl;// 6 }
大分イケてるC++なコードが書けるようになりました! CTPが正式に入るのはメジャーリリースの時だと思うので、恐らくVisual Studio 2014/2015(仮)辺になると思います。 Visual C++頑張れ~*1