Clang に部分的ではあるが C++14 の機能がいくつか実装された
Clang に部分的ではありますが、C++14 の機能がいくつか実装されました。
- C++1y implementation status - Clang
- Return type deduction for normal functions
- Runtime-sized arrays with automatic storage duration
- Relaxing requirements on constexpr functions
と、いうことで 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 もじわじわと実装されていますし、正式に決定するのが楽しみですね!