Skip to content

Latest commit

 

History

History
108 lines (78 loc) · 8.88 KB

cpp14.md

File metadata and controls

108 lines (78 loc) · 8.88 KB

C++14

概要

C++14とは、2014年12月に改訂され、ISO/IEC 14882:2014で標準規格化されたC++バージョンの通称である。

前バージョンであるC++11からマイナーバージョンアップされ、小さな機能拡張が行われた。

このバージョンは、策定中はC++1yと呼ばれていた。前バージョンであるC++11が策定中、C++0xと呼ばれていたことから、「xの次」という意味で「y」が使われていた。

言語機能

言語機能 説明
2進数リテラル 2進数を表す0b or 0Bプレフィックスを付けた数値リテラルの記述を可能とする
通常関数の戻り値型推論 関数の戻り値型をautoにすることで、return文から戻り値の型を推論させる
decltype(auto) decltypeの規則による変数の型推論
後置戻り値型をプレースホルダーにすることを許可 戻り値の型を後置する関数宣言構文とラムダ式の戻り値型にautoを使用できるようにする
ラムダ式の初期化キャプチャ キャプチャに代入構文を導入し、一つの変数に複数のキャプチャ方法を指定可能にする
ジェネリックラムダ ラムダ式のパラメータをautoにすることで、ジェネリックな関数呼び出し演算子を持つ関数オブジェクトを生成する
変数テンプレート 変数定義時のテンプレート指定を可能にする
constexpr関数内での条件分岐とループの文を許可 if文、switch文による条件分岐の許可。
for文、while文、do-while文によるループの許可。
void戻り値型の許可
初期化を伴う変数宣言の許可。
変数書き換えの許可
宣言時のメンバ初期化を持つ型の集成体初期化を許可 集成体において、宣言時に初期化されているメンバを持つことを許可する
ネストする集成体初期化における波カッコ省略を許可 一様初期化と初期化子リストを組み合わせた際、二重に波カッコが必要となっていた仕様を緩和し、波カッコを省略できるようにする
[[deprecated]]属性 非推奨の機能であることを示す属性
数値リテラルの桁区切り文字 シングルクォーテーションで数値リテラルを桁区切りする
サイズ付きデアロケーション サイズをとるdelete演算子のオーバーロードを許可する
動的メモリ確保の省略の許可 デフォルトの::operator newによる動的メモリ確保を省略したりまとめたりする事を許可する

小さな変更

ここでは、コア言語作業グループへ問題報告され、その解決策として導入された言語仕様の変更を解説する。

言語機能 説明
更新された定義済みマクロ 標準規格で定義されたマクロの更新
機能テストマクロ C++14 の機能がサポートされているかどうかをテストするためのマクロ
リテラル演算子のスペースを省略可能とする operator""とサフィックス名の間にスペースを入力しなくてもよくなった
nullptr_t型の定数式を非型テンプレートパラメータとすることを許可 nullptr_t型の値をテンプレート引数として渡せるようになった

ライブラリ更新の概要

コンテナ

イテレータ

  • Forward Iteratorを値初期化した場合に、どこも指さないヌルイテレータになる、という規定が追加された(参照 : N3644 Null Forward Iterators)

アルゴリズム

  • 以下のアルゴリズムに、2つ目のイテレータ範囲の終端イテレータをパラメータにとるバージョンを追加。これにより、2つの範囲が同じ長さかを事前にユーザーがチェックする必要がなくなった
  • 乱数生成を行うアルゴリズム、std::rand()std::random_shuffle()を非推奨とする。std::rand()の代わりに<random>ヘッダで定義される乱数生成器と分布クラスを、std::random_shuffle()の代わりにstd::shuffle()を使用すること

メモリ管理

入出力

  • 文字列をクォート修飾するstd::quotedマニピュレータを追加

汎用的なユーティリティ

  • 2つの値を入れ替える関数std::exchange()を追加
  • コンパイル時整数シーケンスstd::integer_sequenceを追加
  • タプルを型の集合と見なし、型を指定して対応する値を取得するstd::get()のオーバーロードを追加
  • <type_traits>ヘッダの、メンバ型typeを定義するクラステンプレートに、エイリアステンプレート版を追加。そのバージョンには、_tサフィックスが付く

リテラル演算子

  • std::basic_stringリテラル演算子sを追加
    • "hello"sは、文字コード未規定のstd::stringオブジェクトを表すリテラル
    • L"hello"sは、文字コード未規定のstd::wstringオブジェクトを表すリテラル
    • u8"hello"sは、UTF-8文字コードのstd::stringオブジェクトを表すリテラル
    • u"hello"sは、UTF-16文字コードのstd::u16stringオブジェクトを表すリテラル
    • U"hello"sは、UTF-32文字コードのstd::u32stringオブジェクトを表すリテラル
  • std::chrono::durationの、各時間単位を表す、以下のリテラルを追加
  • std::complexの、各要素型を表す、以下のリテラルを追加

並行処理

  • Readers-writer lockと呼ばれる、書き込みを行うユーザーが1人、読み込みを行うユーザーが複数いる状況で効率的に振る舞うミューテックスの実装として、<shared_mutex>ヘッダを追加

参照