C++と色々

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

Visual Studio 2013 RCが出た

Visual Studio 2013 RCがリリースされました。
C++が好きな自分としてはPreviewから更に新しく追加されたC++11/14の機能が気になります。(自分はC99については分からないので触れていません)
さっそくPremium版をインストールして遊んでみました。

#include <type_traits>
#include <cassert>

class sample
{
public:
    //自動生成される関数のdefault/delete指定
    sample() = default;
    ~sample() = default;
    sample(const sample&) = delete;
    sample& operator=(const sample&) = delete;
    //暗黙のムーブコンストラクタ、ムーブ代入演算子は未対応
    //sample(sample&&) = default;

    //非静的データメンバの初期化
    int value = 42;

    //usingによるtypedef
    using type = int;
};

//delete function
void func(int);
void func(double) = delete;

//template alias
template <class T>
using identity = std::common_type<T>;
identity<double>::type d = 3.14;

//STLのtemplate alias対応
std::make_unsigned_t<int> n = 10U;

//sscriskさんのブログで触れられていたバグが治っているか検証 参考 ttp://sscrisk.hatenablog.com/?page=1377074047

static_assert(std::is_standard_layout<int&>::value == false, "");
static_assert(std::is_standard_layout<int&&>::value == false, "");

//治ってない
//static_assert(std::is_trivially_copyable<int&>::value == false, "");
//static_assert(std::is_trivially_copyable<int&&>::value == false, "");

static_assert(std::is_trivially_copyable<void>::value == false, "");

static_assert(std::is_trivial<int&>::value == false, "");
static_assert(std::is_trivial<int&&>::value == false, "");

static_assert(std::is_scalar<std::nullptr_t>::value, "");

int main()
{
    sample s;
    assert(s.value == 42);
    //decltypeから直接メンバを呼び出せない(対応お願いします)
    //decltype(s)::type i = 0;
}

上記のコードがコンパイル通りました。CTPでは更にC++11/14の機能が追加されるようです。
早くconstexpr来て欲しいですね…

すごくどうでもよいこと

using aliasによって今後新しいプロジェクトではtypedefキーワードが空気になってしまうのではないでしょうか。個人的にtypedefキーワードがC++03時代のautoキーワードみたいな存在になってしまうのではないかと思っています。また同時に、usingキーワードにどんどん色んな機能を持たせているようにも見えます。どのキーワードも腐ることなく機能を分散できたらいいのになと思いました。*1

*1:registerやvolatileやexportなどはどうすればいいんでしょう…