C ++ 14


C++14

C ++ 14はバージョンであるISO / IECのための14882標準C ++プログラミング言語。これは、主にバグ修正と小さな改善を特徴とするC ++ 11の小さな拡張であることが意図されており、C ++ 17に置き換えられました。その承認は2014年8月18日に発表されました。 C ++ 14は2014年12月にISO / IEC 14882:2014として公開されました。
以前のC ++標準リビジョンは著しく遅れていたため、C ++ 11標準がリリースを期待して「C ++ 0x」と呼ばれていたのと同様に、承認されるまで代わりに「C ++ 1y」という名前が使用されることがありました。 2010年以前(実際には2010年に、そして最終的には2011年に滑り込んだものの)。

コンテンツ
1 新しい言語機能
1.1 関数の戻り型の控除 1.2 宣言時の代替タイプの演繹 1.3 緩和されたconstexpr制限 1.4 可変テンプレート 1.5 集約メンバーの初期化 1.6 バイナリリテラル 1.7 数字区切り文字 1.8 一般的なラムダ 1.9 ラムダキャプチャ式 1.10 属性[]
2 新しい標準ライブラリ機能
2.1 共有ミューテックスとロック 2.2 連想コンテナでの異種ルックアップ 2.3 標準のユーザー定義リテラル 2.4 タイプによるタプルアドレッシング 2.5 小さなライブラリ機能
3 コンパイラのサポート
4 参考文献
5 外部リンク

新しい言語機能
これらは、C ++ 14のコア言語に追加された機能です。

関数の戻り型の控除
C ++ 11では、ラムダ関数がreturnステートメントに指定された式の型に基づいて戻り型を推測できるようにしました。C ++ 14は、この機能をすべての機能に提供します。また、これらの機能をラムダ関数に拡張し、の形式ではない関数の戻り型の推定を可能にしますreturn expression;。
戻り型の推定を誘導するには、関数をauto戻り型として宣言する必要がありますが、C ++ 11では末尾の戻り型指定子を使用しません。
自動DeduceReturnType (); //決定するタイプを返します。
関数の実装で複数の戻り式が使用されている場合、それらはすべて同じ型を推測する必要が
戻り型を推測する関数は前方宣言できますが、定義されるまで使用できません。それらの定義は、それらを使用する翻訳ユニットが利用できる必要が
このタイプの関数では再帰を使用できますが、関数の定義で少なくとも1つのreturnステートメントの後に再帰呼び出しを実行する必要が
オートコレクト(int i ) {{ if (i == 1 )
私を返す; // intとして推定される型を返します
正しい(i -1 )+ iを返します。//今すぐ呼んでも大丈夫} 自動間違っている(int i ) {{ if (i != 1 )
間違った(i -1 )+ iを返す; //これを呼び出すには早すぎます。事前のreturnステートメントはありません。 私を返す; // intとして推定される型を返します}

宣言時の代替タイプの演繹
C ++ 11では、型推論の2つの方法が追加されました。auto与えられた式に基づいて、適切なタイプの変数を作成する方法でした。decltype与えられた式のタイプを計算する方法でした。ただし、さまざまな方法で型decltypeをauto推測します。特に、を使用するauto場合と同様に、常に非参照型を推測しますがstd::decay、auto&&常に参照型を推測します。ただし、decltype式の値のカテゴリとそれが推定する式の性質に基づいて、参照型または非参照型を推定することができます。
int i ; int && f (); 自動x3a = i ; // decltype(x3a)はint decltype (i )x3d = i ; // decltype(x3d)はint auto x4a = (i ); // decltype(x4a)はint decltype ((i ))x4d = (i ); // decltype(x4d)はint&auto x5a = f (); // decltype(x5a)はint decltype (f ())x5d = f (); // decltype(x5d)はint &&
C ++ 14はdecltype(auto)構文を追加します。これにより、auto宣言でdecltype指定された式のルールを使用できるようになります。
decltype(auto)構文もで使用できる戻り値の型推論使用して、decltype(auto)構文を代わりにauto、関数の戻り値の型推論のために。

緩和されたconstexpr制限
C ++ 11では、constexprで宣言された関数の概念が導入されました。コンパイル時に実行できる関数。それらの戻り値は、整数テンプレート引数などの定数式を必要とする操作によって消費される可能性がただし、C ++ 11 constexpr関数には、返される単一の式(static_assertおよび、sとその他の少数の宣言)しか含めることができませんでした。
C ++ 14は、これらの制限を緩和します。Constexprで宣言された関数には、次のものが含まれる可能性が
以下を除くすべての宣言:
staticまたはthread_local変数。
イニシャライザなしの変数宣言。
条件分岐ステートメントifとswitch。
範囲ベースを含む、任意のループステートメントfor。
オブジェクトの存続期間が定数式関数内で始まった場合にオブジェクトの値を変更する式。これには、const constexpr宣言されていない非静的メンバー関数の呼び出しが含まれます。
goto C ++ 14の緩和されたconstexprで宣言された関数ではステートメントは禁止されています。
また、C ++ 11は、宣言constexprされたすべての非静的メンバー関数もconst、に関して暗黙的に宣言されたと述べていますthis。その後、削除されました。非静的メンバー関数は非静的である可能性がありますconst。ただし、上記の制限により、非const constexprメンバー関数は、そのオブジェクトの存続期間が定数式の評価内で始まった場合にのみ、クラスメンバーを変更できます。

可変テンプレート
以前のバージョンのC ++では、テンプレート化できるのは関数、クラス、または型エイリアスのみでした。C ++ 14では、テンプレート化された変数を作成できます。提案に与えられた例は、可変であるpiの値を取得するために読み取ることができるパイ様々な種類(例えば、用3で可能な最も近い値、一体型として読み取る場合float、doubleまたはlong double精度として読み出すfloat、doubleまたはlong doubleそれぞれを、等)。の通常のルールは、特殊化を含むそのような宣言と定義に適用されます。 <タイプ名 T >constexpr T pi = T (3.141592653589793238462643383 ); //通常の特殊化ルールが適用されます:template <>constexpr const char * pi < const char *> = “pi” ;

集約メンバーの初期化
C ++ 11は、メンバー初期化子を追加しました。これは、コンストラクターがメンバー自体を初期化しない場合にクラススコープでメンバーに適用される式です。集計の定義が変更され、メンバー初期化子を持つクラスが明示的に除外されました。したがって、集約初期化を使用することは許可され
C ++ 14はこの制限を緩和し、そのようなタイプでの集約初期化を可能にします。ブレースされた初期化リストがその引数の値を提供しない場合、メンバー初期化子がその値を処理します。

バイナリリテラル
C ++ 14の数値リテラルは、バイナリ形式で指定できます。構文はプレフィックス0bまたはを使用します0B。この構文は、Java、C#、Swift、Go、Scala、Ruby、Python、OCamlなどの他の言語でも使用されており、少なくとも2007年以降、一部のCコンパイラでは非公式の拡張機能として使用されています。

数字区切り文字
C ++ 14では、一重引用符は、整数リテラルと浮動小数点リテラルの両方の数値リテラルの数字区切り文字として任意に使用できます。これにより、人間の読者がをサブタイズすることで多数を解析しやすくなります。
auto integer_literal = 1’000’000 ; 自動floating_point_literal = 0.000’015’3 ; auto binary_literal = 0b0100’1100’0110 ; auto a_dozen_crores = 12’00’00’000 ;

一般的なラムダ
C ++ 11では、ラムダ関数パラメーターを具象型で宣言する必要がC ++ 14はこの要件を緩和し、ラムダ関数パラメーターをauto型指定子で宣言できるようにします。
auto lambda = [](auto x 、auto y ){ return x + y ;};
auto(似ていますが、すべての点で同一ではない型推論、一般的なラムダは、テンプレート引数控除のルールに従う)。上記のコードはこれと同等です:
構造体{ テンプレート<タイプ名 T 、タイプ名U >
自動演算子()(T x 、U y )const { return x + y ;}
}ラムダ{};
ジェネリックラムダは、基本的にテンプレート化されたファンクターラムダです。

ラムダキャプチャ式
C ++ 11ラムダ関数は、値のコピーまたは参照によって外部スコープで宣言された変数をキャプチャします。これは、ラムダの値メンバーを移動専用タイプにすることはできないことを意味します。 C ++ 14では、キャプチャされたメンバーを任意の式で初期化できます。これにより、外部スコープに対応する名前の変数がなくても、value-moveによるキャプチャとラムダの任意のメンバーの宣言の両方が可能になります。
これは、イニシャライザ式を使用して行われます。
自動ラムダ= {戻り値;};
ラムダ関数lambdaは1を返しますvalue。これは、で初期化されたものです。宣言されたキャプチャは、のように初期化式から型を推測しautoます。
これは、標準std::move機能を使用して、移動によるキャプチャに使用できます。
std :: unique_ptr < int > ptr (new int (10 )); auto lambda = [ value = std :: move (ptr )] { return * value ;};

属性 []
このdeprecated属性を使用すると、非推奨のエンティティにマークを付けることができます。これにより、使用は引き続き合法になりますが、使用が推奨されておらず、コンパイル中に警告メッセージが出力される可能性があることをユーザーに通知します。オプションの文字列リテラルをの引数として表示して、deprecated非推奨の理由を説明し、置換を提案することができます。
[] int f (); [[非推奨(”g()はスレッドセーフではありません。代わりにh()を使用してください” )]]void g (int &x ); void h (int &x ); ボイドテスト() {{ int a = f (); //警告: ‘f’は非推奨ですg (a ); //警告: ‘g’は非推奨です:g()はスレッドセーフではありません。代わりにh()を使用してください}

新しい標準ライブラリ機能

共有ミューテックスとロック
C ++ 14は、共有時限ミューテックスとコンパニオン共有ロックタイプを追加します。

連想コンテナでの異種ルックアップ
C ++標準ライブラリは、 4つの連想コンテナクラスを定義します。これらのクラスを使用すると、ユーザーはそのタイプの値に基づいて値を検索できます。マップコンテナを使用すると、ユーザーはキーと値を指定できます。ルックアップはキーによって実行され、値を返します。ただし、ルックアップは、マップのようにキーであるか、セットのように値自体であるかに関係なく、常に特定のキータイプによって実行されます。
C ++ 14では、比較演算子がその型を実際のキー型と比較できる限り、任意の型を介してルックアップを実行できます。これにより、からのマップをstd::string、const char*またはoperator< オーバーロードが利用可能な他のタイプと比較できるようになります。またstd::set、ユーザーにfindダミーオブジェクトの作成を強制せずに、単一のメンバーの値で複合オブジェクトのインデックスを作成する場合にも役立ちます(たとえばstruct Person、名前で人を見つけるために全体を作成する場合)。
下位互換性を維持するために、異種ルックアップは、関連コンテナーに指定されたコンパレーターで許可されている場合にのみ許可されます。標準ライブラリクラスstd::less<>とstd::greater<>は、異種ルックアップを可能にするために拡張されています。

標準のユーザー定義リテラル
C ++ 11は、ユーザー定義のリテラルサフィックスの構文を定義しましたが、標準ライブラリはそれらのいずれも使用しませんでした。C ++ 14は、次の標準リテラルを追加します。
「s」、さまざまなstd::basic_stringタイプを作成するため。
「h」、「min」、「s」、「ms」、「us」、「ns」、対応するstd::chrono::duration時間間隔を作成します。
「if」、「i」、「il」、対応するstd::complex、std::complexおよびstd::complex虚数を作成します。
auto str = “hello world” s ; //自動推論列自動DUR = 60秒。//自動演繹クロノ::秒、オートZ = 1 I ; // complex を自動推定します
2つの「s」リテラルは相互作用しません。文字列1は文字列リテラルに対してのみ動作し、秒用の1つは数値に対してのみ動作するためです。

タイプによるタプルアドレッシング
std::tupleC ++ 11に導入されたタイプは、型付き値の集合がコンパイル時定数の整数によって索引付けされることを可能にします。C ++ 14はこれを拡張して、インデックスではなくタイプでタプルからフェッチできるようにします。タプルにそのタイプの要素が複数ある場合、コンパイル時エラーが発生します:
タプル<文字列、文字列、int > t (”foo” 、”bar” 、7 ); int i = get < int > (t ); // i == 7 int j = get < 2 > (t ); //以前と同じ:j == 7 string s = get < string > (t ); //あいまいさによるコンパイル時エラー

小さなライブラリ機能
std::make_uniqueオブジェクトのようstd::make_sharedに使用できstd::unique_ptrます。
std::integral_constant得られたoperator()一定の値を返すために過負荷を。
std::integer_sequenceパラメータパック内の要素のインデックスなど、コンパイル時の整数シーケンスを表すために、クラステンプレートと関連するエイリアステンプレートが追加されました。
グローバルstd::begin/std::end関数は、定数イテレータを返すstd::cbegin/std::cend関数、および逆イテレータを返すstd::rbegin/std::rendおよびstd::crbegin/std::crendで拡張されました。
std::exchange関数テンプレートは、変数に新しい値を代入し、古い値を返します。
新のオーバーロードstd::equal、std::mismatchおよびstd::is_permutation呼び出し側が個別に二つの範囲が同じ長さのものであることを確認する必要がありますしないように、2つ目の範囲のイテレータのペアを取ります。
std::is_finalクラスがマークされている場合型特性を検知しますfinal。
std::quotedストリームI / Oマニピュレータは、出力に区切り文字(二重引用符をデフォルト)を配置し、入力にそれらを除去し、任意の埋め込み区切り文字をエスケープすることにより、埋め込まれたスペースで文字列を挿入し、抽出することができます。

コンパイラのサポート
Clangは3.4でC ++ 14のサポートを終了しましたが、標準名はc ++ 1yで、C ++ 14をClang6のデフォルトのC ++標準にしました。 GCCはGCC5でのC ++ 14のサポートを終了しました。 C ++ 14をGCC6のデフォルトのC ++標準にしました。 Microsoft Visual Studio 2017は、「ほぼすべての」C ++ 14機能を実装しました。

参考文献
^ サッター、ハーブ(2014年8月18日)、C ++ 14があります!、
^ 「ISO / IEC14882:2014」。
^ Wong、Michael
「C ++標準会議からの眺め2013年4月パート1」。C / C ++カフェ。
^ メリル、ジェイソン
「N3638通常機能のリターン型控除(リビジョン5)」。
^ http://thbecker.net/articles/auto_and_decltype/section_10.html
^ スミス、リチャード
「N3652constexpr関数の制約を緩和する」。
^ サッター、ハーブ
「トリップレポート:ISO C ++ 2013年春の会議」。isocpp.org 。
^ Dos Reis、Gabriel
「N3651可変テンプレート(リビジョン1)」(PDF)。
^ Vandevoorde、Daveed; Voutilainen、Ville
「N3653メンバーの初期化子と集計」。
^ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=23479#c29 ^ クラウル、ローレンス; スミス、リチャード; スナイダー、ジェフ; Vandevoorde、Daveed
「N3781単一引用符-数字区切り文字としてマーク」(PDF)。
^ ヴァリ、ファイサル; サッター、ハーブ; アブラハム、デイブ
“N3649 Generic(Polymorphic)Lambda Expressions(Revision 3)”。
^ 「Lambdaでキャプチャを移動する」。スタックオーバーフロー。
^ ウォン、マイケル
「C ++標準会議からの眺め2013年4月パート3」。C / C ++カフェ。
^ ヒナント、ハワード; ヴォルマン、デトレフ; ベーム、ハンス
「C ++でのN3659共有ロック(リビジョン2)」。
^ Wong、Michael
「C ++標準会議からの眺め2013年4月パート2」。C / C ++カフェ。
^ 「N3657アソシアティブコンテナへの異種比較ルックアップの追加(rev 4)」。
^ ピーター・ソマラード
「N3642標準ライブラリタイプのユーザー定義リテラル(パート1-バージョン4)」(PDF)。
^ Spertus、Mike
「タイプ別のタプルに対応するためのN3670の表現:リビジョン2」。
^ ウェイクリー、ジョナサン
「N3658コンパイル時整数シーケンス」。
^ Yasskin、Jeffrey
「N3668exchange()ユーティリティ関数、リビジョン3」。
^ Spertus、Mike; ポール、アッティラ
「N3671非変更シーケンス操作をより堅牢にする:リビジョン2」。
^ Dawes、Beman
「N3654引用文字列ライブラリの提案(リビジョン2)」。
^ 「ClangでのC ++サポート」。検索された28 5月2016。
^ 「GCCでのC ++標準のサポート」。検索された28 5月2016。
^ 「MicrosoftのC ++標準への準拠」。

外部リンク
C ++ 14:知っておくべきことDr. Dobb’sの機能の概要、2014年9月16日