Clang に部分的ではあるが C++14 の機能がいくつか実装された

Clang に部分的ではありますが、C++14 の機能がいくつか実装されました。


と、いうことで svn からビルドして試してみました。

[ソース]

#include <vector>
#include <type_traits>

// Return type deduction for normal functions
// lambda expressins と同じように戻り値型に auto が使用出来る
template<typename T, typename U>
auto
plus(T t, U u)/* ->decltype(t + u) */{
    return t + u;
}

template<typename T>
auto
begin(T&& t){
    return t.begin();
}


// Relaxing requirements on constexpr functions
constexpr auto
is_even(int n){
    // ローカル変数を定義したり
    int x = n % 2;

    // if 文を使用したり
    if( x == 0 ){
        return true;
    }
    else{
        return false;
    }
}

// これは動作しなかった
// constexpr int
// min(std::initializer_list<int> xs){
//     int min = std::numeric_limits<int>::max();
//     for(int x : xs){
//         if( x < min ){
//             min = x;
//         }
//     }
//     return min;
// }

int
main(){
    static_assert(std::is_same<decltype(plus(12, 5)), int>{}, "");
    static_assert(std::is_same<decltype(plus(0.4f, 5)), float>{}, "");
    
    std::vector<int> v;
    auto first = ::begin(v);
    static_assert(std::is_same<decltype(first), std::vector<int>::iterator>{}, "");

    static_assert( is_even(2), "");
    static_assert(!is_even(7), "");
    
    return 0;
}


こんな感じです。
C++11 では戻り値型に auto を使用した場合、後置で型を定義する必要があったんですが、C++14 では lambda expressions のような型推論を行なってくれます。
decltype を使用して戻り値型を定義する場合、コードの重複が激しかったのでこれは便利ですね。


また、constexpr の制限もかなり緩和されるみたいでローカル変数や if 文なんかが使えるようになったみたいです。やりたい放題ですね。
これで 『constexpr 関数でローカル変数を使用したい場合、新しい関数を定義して引数をローカル変数の代わりに…』というようなテクニックが必要なくなったのでだいぶコードの量は減ると思います。


C++14 もじわじわと実装されていますし、正式に決定するのが楽しみですね!

[コンパイラ]

  • clang++ (LLVM) 3.3 20130504(trunk)