C++と色々

主にC++やプログラムに関する記事を投稿します。

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

アナウンスされていませんが地味に、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

*1:なおgccC++11を、clangはC++14を実装完了しています