「C++14」の版間の差分
提供: C++入門
(相違点なし)
|
2013年12月29日 (日) 13:28時点における版
C++14 とは、C++11のマイナーバージョンアップとラムダ式などの機能追加を行われたバージョン版のC++です。
読み方
- C++14
- しーぷらすぷらす じゅうよん
目次
概要
C++14では、C++98に対するC++03程度の修正を予定していたが、機能追加を行われることになりました。 2014年度中に仕様が策定される予定です。 C++14の後は、C++17を目指す C++1yが予定されています。
コア言語
- 2進数リテラル
- 実行時サイズの配列
- 通常の関数の戻り値型の推論
- ジェンリックラムダ
- 一般化されたラムダキャプチャ
- constexpr 関数の制限の緩和
- 変数テンプレート
- 軽量コンセプト
2進数リテラル
0b もしくは 0B のプレフィックスをつけて、数値の2進数リテラルを記述できます。
int i = 0b1100; // i = 12
実行時サイズの配列
配列のサイズ(要素数)を実行時の値で指定できるようになります。
void f(int i) { int a[i];// }
C((とは、sizeofで値がとれないなど、細かい部分で互換性がありません。
通常の関数の戻り値型の推論
ラムダ式と同様に、通常の関数でもreturn文から戻り値の型を推論できるようにします。
auto f(); // 関数宣言では、戻り値の型は、不明 auto f(){return 123;}; // 関数f()の定義で、戻り値の型は int となる。 int x = f();// x = 123;
ジェンリックラムダ
ラムダ式のパラメータがジェンリックにできるようになります。
[](const auto& a, const auto& b) { return a > b; };
一般化されたラムダキャプチャ
int x = 1; // xをコピーしたy, xの参照をキャプチャしたz auto f = [y=x, &z=x] { ... }; auto g = [y = x + 1] { return y; }; // 2を返す
ムーブキャプチャ
std::unique_ptr<int> p(new int(3)); auto f = [p = std::move(p)]{ ...; };
constexpr 関数の制限の緩和
- if, switch による条件分岐を許可
- for, while, do-while のループの許可
- void 戻り値型の許可
- パラメータの参照で書き換えを行う
- 初期化をともなう変数宣言の許可
- static, thread_local は除く
- 変数書き換えの許可
constexpr int abs(int i) { if (i < 0) { i = -i; } return i; }
変数テンプレート
変数定義にテンプレートを使用できるようになります。
template <class T> constexpr T pi = T(3.1415); template <class T> T menseki(T hankei) { return pi<T> * hankei * hankei; }
軽量コンセプト
- コンセプトの軽量版
- テンプレートの型制約機能
ライブラリ
- make_unique()
- exchange()
- コンパイル時 整数シーケンス
- tupleの型指定 get()
- quoted マニピュレータ
- ユーザー定義リテラルライブラリ
- Type Traits のエイリアステンプレート
- optional 型
- 実行サイズの配列
- 共有 mutex
- ファイルシステム
- ネットワークライブラリ
GNU GCC/g++ C++14 サポート状況
- http://gcc.gnu.org/projects/cxx1y.html
- g++49(GCC 4.9)が比較的いろいろサポートしています。
- Tweak to certain C++ contextual conversions N3323 4.9
- Binary literals N3472 4.3 (GNU) , 4.9 (N3472)
- Return type deduction for normal functions N3638 4.8 (N3386) , 4.9 (N3638)
- (Moved from the standard to a separate technical specification) N3639 ?.? (GNU VLAs) , 4.9 (N3639)
- Generalized lambda capture (init-capture) N3648 4.5 (partial) , 4.9 (N3648)
- Generic (polymorphic) lambda expressions N3649 4.9
- ((deprecated)) attribute N3760 4.9 (N3797)
- Single-quotation-mark as a digit separator N3781 4.9 (N3797)
- g++49 でサポートされていないもの。
- Runtime-sized arrays with automatic storage duration
- Variable templates N3651 No [WIP]
- Relaxing requirements on constexpr functions N3652 No
- Member initializers and aggregates N3653 No
- Clarifying memory allocation N3664 N/A
- Sized deallocation N3778 No
Clang clang++ C++14 サポート状況
- http://clang.llvm.org/cxx_status.html
- clang 3.4(clang++34)
- clang 3.4 で C++14の機能を実装しました。
- C++14は、clang++のオプション -std+c++1y で有効になります。
インストール
Ubuntu
sudo wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-get install clang-3.4 lldb-3.4
sudo add-apt-repository 'deb http://llvm.org/apt/precise/ llvm-toolchain-precise main' wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key|sudo apt-key add - sudo apt-get update sudo apt-get install clang-3.4 clang-3.4-doc libclang-common-3.4-dev \ libclang-3.4-dev libclang1-3.4 libclang1-3.4-dbg libllvm-3.4-ocaml-dev \ libllvm3.4 libllvm3.4-dbg lldb-3.4 llvm-3.4 llvm-3.4-dev llvm-3.4-doc \ llvm-3.4-examples llvm-3.4-runtime cpp11-migrate-3.4 clang-format-3.4