C++17

C++ > C++17 C++17は、プログラミング言語C++の国際規格ISO/IEC 14882:2017の略称である。 今回の改定では新機能の追加のみではなく、いくつかの機能が廃止されている。 トライグラフの廃止。 標準ライブラリから、すでに非推奨になっていた std::auto_ptr, std::random_shuffle を含むいくつかの型や関数、古い関数アダプタが取り除かれた。これらはC++11で std::unique_ptr、std::shuffle、std::bind、ラムダのような改良された手段に取って代わられた。 (すでに非推奨となっていた) 記憶域クラス指定子としてのキーワードregisterの廃止。キーワード自体は未使用で予約される。 static_assertの診断メッセージを省略可能とした。 テンプレートのテンプレートのパラメータに (class の代わりに) typename を使えるようにした。 初期化リストからの型推論 (auto) 規則を新設。 入れ子の名前空間の定義を namespace X { namespace Y { … } }等とする代わりにnamespace X::Y { … }と書けるようにした。 名前空間や列挙型に属性を書けるようにした。 新たに[[fallthrough]]、[[maybe_unused]]、[[nodiscard]]属性を標準に追加。 UTF-8 (u8) 文字リテラル。 十六進浮動小数点リテラル。 全ての非型テンプレート引数における定数評価。 可変長引数テンプレート（英語版）における畳み込み式。 if constexpr(expression)の形式によるコンパイル時の静的if。 構造化束縛宣言。auto [a, b] = getTwoReturnValues();のように書くことができるようになった。 if文およびswitch文での初期化子。 T型 (トップレベルのcv修飾を無視する) の純粋右辺値式からT型のオブジェクトをコピー初期化および直接初期化するとき、純粋右辺値式からコピーコンストラクタやムーブコンストラクタが呼ばれなくなった。詳細は「コピーの省略」を参照のこと。 over-aligned なメモリ確保に関する拡張。 クラステンプレートの実引数推定 (Class Template Argument Deduction: CTAD)。コンストラクタの推定ガイドが導入されたことで、std::pair<double, bool>(5.0, false)のようなコンストラクタの引数の型や、std::make_pair(5.0, false)のようなヘルパー関数テンプレートが必要なくなり、std::pair(5.0, false)のように書くことができるようになった。 インライン変数により、単一定義規則（英語版）に反することなくヘッダファイルで変数を定義できるようになった。効果はインライン関数と同様である。 __has_includeでヘッダが利用可能かをプリプロセッサディレクティブで確認できるようになった。 __cplusplusの値は201703Lとなった。 例外指定が関数の型の一部となった。 以下のヘッダが追加された。 <any> — あらゆる型を保持できる std::any クラス <filesystem> — ディレクトリやファイルの操作 <optional> — 有効または無効な値を保持する std::optional クラス <string_view> — 読み取り専用で所有権を持たずに文字シーケンスを参照する std::basic_string_view クラス <variant> — 型安全な共用体（union）std::variant クラス ^ “N3981: Removing trigraphs??! (Richard Smith)” (2014年5月6日). 2015年4月3日閲覧。 ^ IBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis ^ a b c “Updates to my trip report”. 2014年11月28日閲覧。 ^ “N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej)”. 2014年11月28日閲覧。 ^ “C++ Keywords: register”. 2018年9月3日閲覧。 ^ “N3928: Extending static_assert, v2 (Walter E. Brown)”. 2015年4月3日閲覧。 ^ “N4051: Allow typename in a template template parameter (Richard Smith)”. 2015年4月3日閲覧。 ^ “N3922: New Rules for auto deduction from braced-init-list (James Dennett)”. 2014年11月28日閲覧。 ^ “N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos)”. 2014年11月28日閲覧。 ^ a b c d “New core language papers adopted for C++17”. 2014年11月15日閲覧。 ^ “N4266: Attributes for namespaces and enumerators (Richard Smith)”. 2014年11月15日閲覧。 ^ “N4640: Working Draft, Standard for Programming Language C++”. pp. 193–195. 2017年3月9日閲覧。 ^ “N4267: Adding u8 character literals (Richard Smith)”. 2014年11月15日閲覧。 ^ UTF-8 文字列リテラルは C++11 から存在する。C++17 では一貫性確保のために対応する文字リテラルが追加されるが、その型はchar型であり、またUTF-8文字リテラルが扱えるコードポイントの範囲は、C0制御文字とラテン基本文字 (C0 Controls and Basic Latin Unicode block) すなわち ASCII に限定されている。なお、C++標準における従来の文字リテラルは、文字符号化方式がASCIIであることが保証されないため、UTF-8文字リテラルはASCIIを保証するという移植性の観点からも有用である。 ^ Thomas Köppe. “Hexadecimal floating literals for C++”. 2017年7月16日閲覧。 ^ “N4659: Working Draft, Standard for Programming Language C++”. 2017年7月16日閲覧。 ^ “N4268: Allow constant evaluation for all non-type template arguments (Richard Smith)”. 2014年11月15日閲覧。 ^ “N4295: Folding expressions (Andrew Sutton, Richard Smith)”. 2014年11月15日閲覧。 ^ “N4659: Working Draft, Standard for Programming Language C++”. 2017年3月24日閲覧。 ^ “N4659: Working Draft, Standard for Programming Language C++”. 2017年3月24日閲覧。 ^ “Selection statements with initializer”. 2018年10月9日閲覧。 ^ “Dynamic memory allocation for over-aligned data”. 2017年3月14日閲覧。 ^ “Class template argument deduction”. 2019年1月30日閲覧。 ^ “CppCon 2018: Timur Doumler “Class template argument deduction in C++17””. 2019年1月30日閲覧。 ^ “N4640: Working Draft, Standard for Programming Language C++”. pp. 431–433. 2017年3月11日閲覧。 ^ “N4659: Working Draft, Standard for Programming Language C++”. 2017年3月24日閲覧。 ^ “P0012R1: Make exception specifications be part of the type system, version 5”. 2018年12月17日閲覧。 C++11 C++14 The C++ Standards Committee 表示 編集