2017年中に改訂される予定のC++14の次のバージョン、仮称C++1zの更新内容をまとめました。正式名称はISO/IEC 14882:2017、通称C++17になる予定です。
C++1zの概要
C++17は、C++11ほど大きな変更はありませんが、重要な言語機能(構造化束縛とか)や、広く適用できるライブラリ機能が多く入っています。ライブラリは、ファイルシステムが入るのが大きいですね。ようやく標準ライブラリのみで、ファイルサイズを取得したり、ファイルのコピーや移動などを扱えるようになります。
策定体制として、Study Group (SG)と呼ばれる専門家グループがたくさん作られ、そこで同時並行に議論、策定が進められていた仕様のうち、固まったものがいくつかC++1zで導入されます。
それぞれの専門家グループで考えられた仕様はTechnical Specification (TS)という単位で個別に各国の承認をとっており、コンパイラでもstd::exprerimental
名前空間以下などで実験的に実装されていました。C++1zでは専門家グループで進められた仕様のうち、以下のものが入ります:
- Library Fundamentals TS (基本的なライブラリ機能)
- Filesystem TS (ファイルシステムのライブラリ)
- Parallelism TS (並列ライブラリ)
- 並列アルゴリズム
C++1zでは間に合わないですが、継続して議論が進められているTSもまだまだあり、このあと仕様が固まったものは、C++1zの次のバージョンC++2x (2020年、C++20予定) に入る予定です。そのなかには、コンセプト、モジュールシステム、トランザクショナルメモリ、並行コンテナ、コルーチン、ネットワークなどがあります。
TS以外の機能としても、多くの便利な機能が入ります。構造化束縛やif constexpr
文などは、とくに便利ですね。
コア言語
言語機能の更新内容です。
変数・データ構造関係
- 浮動小数点数の16進数リテラル
- インライン変数
- 構造化束縛
- 単一要素の波カッコ初期化を
T
に推論する - 使用しない可能性のある変数に対する警告を抑制するための
[[maybe_unused]]
属性 - 戻り値を捨ててはならないことを指定する
[[nodiscard]]
属性 - 値のコピー省略を保証
制御構文
- 範囲for文のための
begin()
とend()
関数が、異なる型を返すことを許可 - if文とswitch文の条件式と初期化を分離
- フォールスルー時の警告を抑制する
[[fallthrough]]
属性 if constexpr
文
ラムダ式
テンプレート
- 畳み込み式
- テンプレートテンプレートパラメータに
typename
キーワードの使用を許可 - クラステンプレートのテンプレート引数推論
- 非型テンプレートパラメータの
auto
宣言 - 全ての非型テンプレート引数の定数式評価を許可
- using宣言のパック展開
定数式
名前空間
例外
属性
- フォールスルー時の警告を抑制する
[[fallthrough]]
属性 - 使用しない可能性のある変数に対する警告を抑制するための
[[maybe_unused]]
属性 - 戻り値を捨ててはならないことを指定する
[[nodiscard]]
属性 - 名前空間と列挙子への属性付加を許可
- 属性の名前空間指定に繰り返しをなくす
- 不明な属性を無視する
プリプロセッサ
機能の削除
古くから非推奨だった機能が削除されます。非推奨になった機能は数バージョン先に削除される可能性がありますので、ご注意ください。
ライブラリ
標準ライブラリの更新内容です。
新ライブラリ
- ファイルシステムライブラリ
- 並列アルゴリズムライブラリ
- 統一的な有効値と無効値の表現をもつ
optional
クラス - 型安全な共用体
variant
クラス - なんでも代入できる
any
クラス - 標準ライブラリの参照をC11に更新
コンテナ
- コンテナのコピー・ムーブ、
swap
操作にnoexcept
を追加 - コンテナの要素情報にアクセスする非メンバ関数
- コンテナに不完全型の最小サポートを追加
- 多相アロケータとメモリプール
- 標準イテレータ全般と
array
の変更操作にconstexpr
を追加 emplace_front
とemplace_back
で追加された要素を返す- 連想コンテナの接合
連想コンテナ用のデフォルトの順序付けmap
とunordered_map
に、挿入失敗時の動作を規定した新たなメンバ関数を追加- 隣接イテレータ
文字列
- 文字配列をコピーせず参照して
basic_string
ライクな操作をするstring_view
basic_string::data()
メンバ関数の非const
版- 文字列検索アルゴリズム
- ロケール依存なし、フォーマット解析なしの高速な文字列・数値変換
char_traits
のconstexpr
対応
アルゴリズム
- ランダムサンプリングアルゴリズム
- 値を範囲内に収める
clamp()
関数 not_fn
- INVOKEコンセプトに従った関数呼び出しをする
invoke()
関数 reference_wrapper
がTriviallyCopyableであることを保証- オブジェクトを
const
にするas_const()
関数 - 未初期化メモリのアルゴリズムと、デストラクタ呼び出しの関数
並行処理
スマートポインタ
shared_ptr
の配列対応shared_ptr::weak_type
shared_ptr::use_count()
の仕様を明確化し、unique()
を非推奨化shared_from_this
の指す先が書き換わらないことを規定- 配列版
unique_ptr
の型変換 unique_ptr
のテンプレート代入演算子に、不足していたSFINAEルールを追加owner_less
で任意の要素型を持つshared_ptr
同士を比較できるようにする
数学
タプル
型特性
- 値を返す型特性クラスのconstexpr変数テンプレート版
void_t
bool_constant
- コンパイル時条件の論理演算
- swap可能かを判定する型特性クラス
- 関数が呼び出し可能かを判定する型特性
has_unique_object_representations
型特性
時間演算
乱数
エラーハンドリング
取り決め
機能の削除
古くから非推奨だった機能や、コンパイラの実装が不十分でユーザーにも使われてこなかった機能などが削除されます。非推奨になった機能は数バージョン先に削除される可能性がありますので、ご注意ください。
- 非推奨だった
auto_ptr
,random_shuffle
, 古い<functional>
の機能を削除 std::function
クラスのアロケータサポートを削除- 非推奨だった
iostream
のエイリアスを削除
機能の非推奨化
まとめていない主な機能
これのほかにも、まとめていない細かい更新はたくさんあります。詳細な更新リストは、cpprefjp/siteリポジトリの以下のWikiページを参照してください。
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。