歴史
C++ 標準委員会が 3 年ごとのリリース サイクルを定める前は、C++17 のリリース日は不確定でした。その期間中、C++17 改訂版は、C++11 の C++0x または C++1x、C++14 の C++1y に続いて、C ++ 1zとも呼ばれていました。C++17 仕様は、2017 年 3 月にドラフト国際標準 (DIS) 段階に達しました。[ 1 ] [ 2 ]この DIS は編集上のコメントのみで満場一致で承認され、[ 3 ]最終標準は2017 年 12 月にISO/IEC 14882:2017として発行されました。 [ 4 ] C++標準テンプレート ライブラリにはほとんど変更が加えられませんでしたが、ヘッダー内のいくつかのアルゴリズムで明示的な並列化がサポートされ、構文がいくつか強化されました。<algorithm>
新機能
C++17では多くの新機能が導入されました。以下のリストは完全ではない可能性があります。
言語
static_assertオプションのテキストメッセージを作成する[ 5 ]- テンプレートパラメータで
typename(の代替としてclass)を許可する[ 6 ]template auto括弧付き初期化リストからの推論に関する新しいルール[ 7 ] [ 8 ]- ネストされた名前空間定義、例:[ 8 ] [ 9 ]の代わりに
namespaceX::Y{...}namespaceX{namespaceY{...}} - 名前空間と列挙子の属性を許可する[ 10 ] [ 11 ]
- 新しい標準属性、および[ 12 ]
[[fallthrough]][[maybe_unused]][[nodiscard]] - UTF-8 (
u8) 文字リテラル[ 10 ] [ 13 ] (UTF-8 文字列リテラルはC++11から存在しています。C++17 では一貫性を保つために対応する文字リテラルが追加されましたが、1 バイトに制限されているため、「基本ラテン文字」とC0 制御コード、つまりASCIIしか格納できません) - 16進浮動小数点リテラル[ 14 ] [ 15 ]
auto非型テンプレートパラメータの型としての使用[ 16 ]- すべての非型テンプレート引数に対する定数評価[ 10 ] [ 17 ]
- 可変引数テンプレートのフォールド式[ 10 ] [ 18 ]
- コンパイル時の静的変数の
if形式は[ 19 ]ifconstexpr(expression) - 構造化されたバインディング宣言により、[ 20 ]
auto[a,b]=getTwoReturnValues(); ifおよびswitchステートメントの初期化子[ 21 ]T型の prvalue 式から型のオブジェクトのコピー初期化および直接初期化を行う場合 (トップレベルの cv 修飾子は無視する)、prvalue 式からのコピー コンストラクタまたはムーブ コンストラクタは生成されません。詳細については、コピー省略をT参照してください。- オーバーアラインメントされたメモリ割り当てに関するいくつかの拡張[ 22 ]
- クラステンプレート引数推論(CTAD)は、コンストラクタ推論ガイドを導入し、例えば明示的なコンストラクタ引数の型を要求する代わりに、追加のヘルパーテンプレート関数。 [ 23 ] [ 24 ]
std::pair(5.0,false)std::pair<double,bool>(5.0,false)std::make_pair(5.0,false) - インライン変数とは、単一定義ルールに違反することなくヘッダーファイル内で変数を定義できる機能です。ルールは実質的にインライン関数と同じです。
__has_includeヘッダーの可用性をプリプロセッサディレクティブでチェックできるようにする[ 25 ]- 値が[ 26 ]
__cplusplusに変更されました201703L - 例外仕様は関数型の一部となった[ 27 ]
- ラムダ式は
*this値によって「 」をキャプチャできます[ 28 ]
削除された機能
今回のC++の改訂では、新機能が追加されただけでなく、いくつかの機能が削除された。
- 三文字語は削除されました。[ 44 ] [ 45 ]
- 非推奨の型や関数が標準ライブラリ
std::auto_ptrから削除されました。これには、、、std::random_shuffleおよび古い関数アダプタが含まれます。 [ 8 ] [ 46 ]これらは、 C++11 でstd::unique_ptr、、、、およびラムダなどの改良された機能に置き換えられました。std::shufflestd::bind - (以前は非推奨だった)キーワードを
registerストレージクラス指定子として使用することは削除されました。[ 47 ]このキーワードは依然として予約されていますが、現在は使用されていません。
参考文献
- ↑ 「N4661 編集者レポート -- プログラミング言語 -- C++」。2017年3月21日。2020年2月4日のオリジナルからアーカイブ。 2017年3月21日取得。
- ↑ 「ISO/IEC DIS 14882: プログラミング言語 — C++」(PDF)。 2017年3月25日にオリジナル(PDF)からアーカイブされました。
- ↑ Herb Sutter (2017年9月6日) 「C++17が正式に承認されました」。2020年1月29日のオリジナルからアーカイブ。 2017年9月12日取得。
- ↑ "ISO/IEC 14882:2017"。2013年1月29日にオリジナルからアーカイブ済み。2017年12月3日に取得。
- ↑ "N3928: static_assert の拡張、v2 (Walter E. Brown)" (PDF)。2015年8月11日にオリジナルからアーカイブ(PDF) 。 2015年4月3日に取得。
- ↑ "N4051: テンプレートのテンプレート パラメーターで型名を許可する (Richard Smith)"。2015年8月11日にオリジナルからアーカイブされました。2015年4月3日に取得。
- ↑ "N3922: 括弧付き初期化リストからの自動推論に関する新しいルール (James Dennett)"。2015年8月10日にオリジナルからアーカイブ済み。2014年11月28日に取得。
- 1 2 3 「旅行記の更新」。2015年3月19日にオリジナルからアーカイブ済み。2014年11月28日に取得。
- ↑ "N4230: ネストされた名前空間の定義 (Robert Kawulak、Andrew Tomazos)"。2015年8月3日にオリジナルからアーカイブされました。2014年11月28日に取得。
- 1 2 3 4 5 「C++17 で採用された新しいコア言語文書」。2015年 4 月 27 日にオリジナルからアーカイブされました。2014年 11 月 15 日に取得。
- ↑ "N4266: 名前空間と列挙子の属性 (Richard Smith)"。2016年3月6日にオリジナルからアーカイブ済み。2014年11月15日に取得。
- ↑ 「N4640: プログラミング言語 C++ の標準規格の作業草案」(PDF) . pp. 193–195 . 2017-03-12 のオリジナルからアーカイブ(PDF) 。2017-03-09に取得。
- ↑ "N4267: u8 文字リテラルの追加 (Richard Smith)"。2015-10-28のオリジナルからアーカイブ済み。2014-11-15に取得。
- ↑ Thomas Köppe. "C++ 用の 16 進浮動小数点リテラル" . 2022 年 9 月 21 日にオリジナルからアーカイブ済み。2017年 7 月 16 日に取得。
- ↑ 「N4659: プログラミング言語 C++ の標準規格の作業草案」(PDF)。§5.13.4。2017年12月7日のオリジナルからアーカイブ(PDF) 。 2017年3月24日取得。
- ↑ James Touton; Mike Spertus (2016-06-23). "Auto を使用した非型テンプレート パラメーターの宣言" . 2017-09-16 のオリジナルからアーカイブ済み。2020-11-08に取得。
- ↑ "N4268: すべての非型テンプレート引数に対して定数評価を許可する (Richard Smith)"。2016年3月12日にオリジナルからアーカイブ済み。2014年11月15日に取得。
- ↑ "N4295: 式の折りたたみ (Andrew Sutton、Richard Smith)"。2015年4月4日にオリジナルからアーカイブ済み。2014年11月15日に取得。
- ↑ "N4659: プログラミング言語 C++ の標準規格の作業草案" (PDF)。§9.4.1。2017-12-07のオリジナルからアーカイブ(PDF) 。2017-03-24に取得。
- ↑ 「N4659: プログラミング言語 C++ の標準規格の作業草案」(PDF)。§11.5。2017年12月7日のオリジナルからアーカイブ(PDF) 。 2017年3月24日取得。
- ↑ 「初期化子付き選択ステートメント」。2017年10月6日にオリジナルからアーカイブ済み。2018年10月9日に取得。
- ↑ 「オーバーアラインメントされたデータのための動的メモリ割り当て」。2017年9月8日にオリジナルからアーカイブ済み。2017年3月13日に取得。
- ↑ 「クラステンプレート引数の推論」。2019年1月31日にオリジナルからアーカイブ済み。2019年1月30日に取得。
- ↑ 「CppCon 2018: Timur Doumler「C++17におけるクラステンプレート引数推論」」" . YouTube . 2019年8月21日にオリジナルからアーカイブされました。2019年1月30日に取得。
- ↑ 「N4640: プログラミング言語 C++ の標準規格作業草案」(PDF) . pp. 431–433 . 2017-03-12 のオリジナルからアーカイブ(PDF) 。2017-03-09に取得。
- ↑ 「N4659: プログラミング言語 C++ の標準規格の作業草案」(PDF)。§19.8。2017年12月7日のオリジナルからアーカイブ(PDF) 。 2017年3月24日取得。
- ↑ "P0012R1: 例外仕様を型システムの一部にする、バージョン 5"。2017-09-12のオリジナルからアーカイブ済み。2018-12-17に取得。
- ↑ "P0018R3: *this のラムダキャプチャを値として[ =,*this ]として取得、バージョン 3"。2017-08-22のオリジナルからアーカイブ済み。2021-06-21に取得。
- ↑ "Adopt Library Fundamentals V1 TS Components for C++17 (R1)"。2016年4月5日にオリジナルからアーカイブ済み。2016年3月23日に取得。
- ↑ 「現在の状況」。2020年9月8日にオリジナルからアーカイブされました。
- ↑ "std::basic_string_view - cppreference.com" . en.cppreference.com . 2016-06-17 のオリジナルからアーカイブ済み。2016-06-23 に取得。
- ↑ "N4259: std::uncaught_exceptions の文言 (Herb Sutter)" (PDF)。2014年11月29日のオリジナルからアーカイブ(PDF) 。 2014年11月15日に取得。
- ↑ "N4279: ユニークキーマップの挿入インターフェースの改善 (Thomas Köppe)"。2015年4月27日にオリジナルからアーカイブ済み。2014年11月15日に取得。
- 1 2 3 「C++17 で採用された新しい標準ライブラリ文書」。2014年 11 月 29 日にオリジナルからアーカイブされました。2014年 11 月 15 日に取得。
- ↑ "N4280: 非メンバーの size() など (Riccardo Marcangelo)" (PDF)。2015年3月9日にオリジナルからアーカイブ(PDF) 。 2014年11月15日に取得。
- ↑ "N4284: 連続イテレータ (Jens Maurer)"。2014年11月29日にオリジナルからアーカイブされました。2014年11月15日に取得。
- ↑ 「ファイルシステムライブラリ提案(ビーマン・ドーズ)」。2016年7月20日にオリジナルからアーカイブ済み。2015年12月12日に取得。
- ↑ 「並列TSは標準化されるべきである」。2016年4月5日にオリジナルからアーカイブ済み。2016年3月23日に取得。
- ↑ "C++17 用数学特殊関数、v5" (PDF)。2016年 4 月 5 日にオリジナルからアーカイブ(PDF) 。2016年 3 月 23 日に取得。
- ↑ 「N4659: プログラミング言語 C++ の標準規格の作業草案」(PDF)。§23.7。2017年12月7日のオリジナルからアーカイブ(PDF) 。 2017年3月24日取得。
- ↑ 「バイト型定義」(PDF)。2017年3月25日にオリジナルからアーカイブ(PDF) 。2017年3月25日に取得。
- ↑ 「N4659: プログラミング言語 C++ の標準規格の作業草案」(PDF)。§23.15.8。2017年12月7日のオリジナルからアーカイブ(PDF) 。 2017年3月24日取得。
- ↑ 「PMR(ポリモーフィックメモリリソース)の完全な説明 - Nico Josuttis」。2021年8月28日にオリジナルからアーカイブ済み。2020年11月16日に取得。
- ↑ "N3981: 三文字語の削除??! (リチャード・スミス)" . 2014-05-06. 2018-07-09 のオリジナルからアーカイブ済み。2015-04-03に取得。
- ↑ IBMによるC++17におけるトライグラフ不利な未来への備えに関するコメント( 2018年9月11日にWayback Machineにアーカイブ済み)、IBM論文N4210、2014年10月10日。著者:Michael Wong、Hubert Tong、Rajan Bhakta、Derek Inglis
- ↑ "N4190: auto_ptr、random_shuffle()、および古い<機能>関連の削除 (Stephan T. Lavavej)"。2017年10月20日にオリジナルからアーカイブ済み。 2014年11月28日に取得。
- ↑ "C++ キーワード: レジスタ"。2018-09-03のオリジナルからアーカイブ済み。2018-09-03に取得。
- ↑ "GCCにおけるC++標準のサポート - GNUプロジェクト - フリーソフトウェア財団(FSF)" . gcc.gnu.org . 2018年4月4日のオリジナルからアーカイブ済み. 2018年4月3日取得.
- ↑ "Clang - C++17、C++14、C++11、C++98 のステータス" . clang.llvm.org . 2013-07-04 のオリジナルからアーカイブ済み. 2018-06-26に取得.
- ↑ corob-msft. "Visual C++ 言語準拠" . docs.microsoft.com . 2018-06-19 のオリジナルからアーカイブ済み. 2018-06-19に取得.
- ↑ 「お知らせ:MSVCがC++標準に準拠」。2018年5月7日。 2018年8月26日のオリジナルからアーカイブ。 2018年5月8日取得。
- ↑ 「第1章 ステータス」 . gcc.gnu.org . 2018年6月4日にオリジナルからアーカイブ済み。2018年6月19日に取得。
- ↑ "libc++ C++17 ステータス" . llvm.org . 2019-05-24 のオリジナルからアーカイブ済み. 2019-05-24に取得.
- ↑ 「お知らせ:MSVCがC++標準に準拠」 . devblogs.microsoft.com . 2018年5月7日。2018年8月26日のオリジナルからアーカイブ済み。 2019年5月24日取得。