「C++14」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「C++14 とは、C++11のマイナーバージョンアップとラムダ式などの機能追加を行われたバージョン版の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

関連項目