C ++ 17


C++17

C17(C標準リビジョン)
と混同しないでください
C ++ 17はバージョンであるISO / IECのための14882標準C ++プログラミング言語。C ++ 17は、C ++ 14と呼ばれる以前のバージョンのC ++標準に置き換わり、後にC ++ 20に置き換えられました。

コンテンツ
1 歴史
2 削除
3 新機能
3.1 言語 3.2 としょうかん
4 コンパイラのサポート
5 ライブラリのサポート
6 も参照してください
7 参考文献

歴史
C ++標準委員会が3年間のリリースサイクルを修正する前は、C ++ 17のリリース日は不確実でした。その期間、C ++ 17リビジョンはC ++ 1zとも呼ばれ、C ++ 11の場合はC ++ 0xまたはC ++ 1x 、C ++ 14の場合はC ++ 1yに続きます。C ++ 17仕様は、2017年3月にドラフト国際規格(DIS)の段階に達しました。 このDISは、編集コメントのみで全会一致で承認され、最終規格は2017年12月に公開されました。 C ++標準テンプレートライブラリにはほとんど変更が加えられていませんが、ヘッダーの一部のアルゴリズムでは明示的なサポートが提供されています。並列化といくつかの構文の強化が行われました。

削除
このC ++のリビジョンでは、新しい機能が追加されただけでなく、いくつかが削除されました。
三重音字の削除。
、、および古い関数アダプターを含む、いくつかの非推奨のタイプおよび関数の標準ライブラリーからの削除。 これらは、改良などの機能によってC ++ 11に取って代わられた、、、およびラムダ。std::auto_ptrstd::random_shufflestd::unique_ptrstd::shufflestd::bind
ストレージクラス指定子としてのキーワードの(以前は非推奨になった)使用の削除。このキーワードは現在予約されており、使用されregister

新機能
C ++ 17は多くの新機能を導入しました。以下のリストは不完全である可能性が

言語
オプションのテキストメッセージを作成するstatic_assertテンプレートパラメータでtypename(の代わりにclass)許可する
braced-init-listからの控除に関する新しいルール auto
ネストされた名前空間定義。たとえば、 の代わりにnamespace X::Y { … }namespace X { namespace Y { … } }
名前空間と列挙子の属性を許可する
新しい標準属性、および[][[maybe_unused]][]
UTF-8()文字リテラル (UTF-8文字列リテラルはC ++ 11以降に存在します。C++ 17は、一貫性を保つために対応する文字リテラルを追加しますが、1バイトに制限されているため可能です。 「のみを保存する基本ラテン」とC0制御コード、すなわちASCIIを)u8
16進浮動小数点リテラル
非型テンプレートパラメータの型としての使用auto
すべての非型テンプレート引数の定数評価
可変個引数テンプレート用の折り畳み式
の形式のコンパイル時の静的ifif constexpr(expression)
構造化されたバインディング宣言、を可能にするauto = getTwoReturnValues();
とステートメントのイニシャライザーifswitch
タイプのprvalue式からのタイプのオブジェクトのコピー初期化および直接初期化(最上位のcv修飾子を無視)は、prvalue式からのコピーまたは移動コンストラクターを生成しません。詳細については、コピーの省略を参照してTT
過剰に調整されたメモリ割り当てに関するいくつかの拡張
クラステンプレート引数演繹(CTAD)、コンストラクター演繹ガイドの紹介。明示的なコンストラクター引数タイプまたは追加のヘルパーテンプレート関数を要求する代わりに許可します。 std::pair(5.0, false)std::pair(5.0, false)std::make_pair(5.0, false)
インライン変数。1つの定義ルールに違反することなく、ヘッダーファイル内の変数を定義できます。ルールは実質的にインライン関数と同じです
__has_include、プリプロセッサディレクティブによってヘッダーの可用性をチェックできるようにします
の値がに変更されました__cplusplus201703L
例外仕様は関数型の一部になりました
ラムダ式は「* this」を値でキャプチャできます

としょうかん
以下を含むほとんどのLibraryFundamentals TSI:
std::string_view、文字シーケンスまたは文字列スライスへの読み取り専用の非所有参照
std::optional、オプションのオブジェクトを表すために、非戻りをサポートする特定のアルゴリズムによって常に返されるとは限らないデータ型
std::any、任意のタイプの単一値を保持するため
std::uncaught_exceptions、の代替としてstd::uncaught_exceptionで例外処理
新しい挿入関数try_emplaceとinsert_or_assignforstd::mapおよびstd::unordered_map key-Value連想データ構造
均一な容器アクセス:std::size、std::emptyおよびstd::data
「連続イテレータ」の定義
ファイルシステムに基づいてライブラリーboost::filesystem
STLアルゴリズムの並列バージョン
楕円積分やベッセル関数など、追加の数学的な特殊関数
std::variant、タグ付き共用体コンテナ
std::byte、許可チャーをモデル化するつもりのデータ・タイプのために交換するバイトバイトではなく文字としてデータを
論理演算子の特徴:std::conjunction、std::disjunctionおよびstd::negation
ヘッダー、ポリモーフィックメモリリソース用

コンパイラのサポート
GCCは、バージョン8以降、C ++ 17言語機能を完全にサポートしています。
Clang 5以降は、すべてのC ++ 17言語機能をサポートしています。
Visual Studio 2017 15.8(MSVC 19.15)以降は、すべてのC ++ 17言語機能をサポートします。

ライブラリのサポート
バージョン9.1以降のlibstdc ++は、C ++ 17を完全にサポートしています(並列処理TSを使用せず、C11ではなくC99を参照する8.1)
バージョン9の時点でのlibc ++はC ++ 17を部分的にサポートしており、残りは「進行中」です。
Visual Studio 2017 15.8(MSVC 19.15)標準ライブラリ以降は、「基本文字列変換」を除き、C11ではなくC99を参照するすべてのC ++ 17ライブラリ機能をサポートします。「エレメンタリー文字列変換」がVisualStudio 2019 16.4 に追加されました

も参照してください
C ++コンパイラ
C11(C標準リビジョン)
C17(C標準リビジョン)

参考文献
^ 「N4661編集者レポート-プログラミング言語-C ++」。
^ 「ISO / IECDIS 14882:プログラミング言語— C ++」(PDF)。2017年3月25日にオリジナル(PDF)からアーカイブされました。
^ ハーブサッター。「C ++ 17は正式に承認されています」。
^ 「ISO / IEC14882:2017」。
^ 「N3981:三重音字の削除??!(リチャード・スミス)」。2014-05-06。
^ 三重音字の準備に関するIBMのコメント-C ++ 17の不利な未来、IBMの論文N4210、2014-10-10。著者:Michael Wong、Hubert Tong、Rajan Bhakta、Derek Inglis ^ 「私の旅のレポートの更新」。
^ “N4190:auto_ptr、random_shuffle()、および古いスタッフの削除(Stephan T. Lavavej)”。
^ 「C ++キーワード:レジスタ」。
^ 「N3928:static_assert、v2(Walter E. Brown)の拡張」(PDF)。
^ “N4051:テンプレートテンプレートパラメータでタイプ名を許可する(Richard Smith)”。
^ 「N3922:braced-init-listからの自動推論の新しいルール(James Dennett)」。
^ “N4230:ネストされた名前空間の定義(Robert Kawulak、Andrew Tomazos)”。
^ “C ++ 17に採用された新しいコア言語ペーパー”。
^ “N4266:名前空間と列挙子の属性(Richard Smith)”。
^ 「N4640:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。pp。193–195。
^ “N4267:u8文字リテラルの追加(Richard Smith)”。
^ ThomasKöppe。「C ++用の16進浮動リテラル」。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§5.13.4。
^ James Touton; マイク・スペルタス(2016-06-23)。「autoを使用した非型テンプレートパラメータの宣言」。
^ “N4268:すべての非型テンプレート引数の定数評価を許可します(Richard Smith)”。
^ 「N4295:折りたたみ式(アンドリュー・サットン、リチャード・スミス)」。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§9.4.1。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§11.5。
^ 「初期化子を使用した選択ステートメント」。
^ 「オーバーアラインされたデータの動的メモリ割り当て」。
^ 「クラステンプレート引数の推論」。
^ “CppCon 2018:Timur Doumler” C ++ 17でのクラステンプレート引数の演繹” “。
^ 「N4640:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。pp。431–433。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§19.8。
^ “P0012R1:例外仕様を型システムバージョン5の一部にする”。
^ “P0018R3:* this by Value as 、バージョン3のラムダキャプチャ”。
^ 「C ++ 17(R1)用のライブラリの基礎V1TSコンポーネントを採用する」。
^ 「現在のステータス」。
^ “std :: basic_string_view –cppreference.com”。en.cppreference.com 。
^ 「N4259:std :: uncaught_exceptions(Herb Sutter)の文言」(PDF)。
^ “N4279:一意キーマップの挿入インターフェイスの改善(ThomasKöppe)”。
^ “C ++ 17に採用された新しい標準ライブラリペーパー”。
^ 「N4280:非会員size()以上(Riccardo Marcangelo)」(PDF)。
^ 「N4284:連続イテレータ(イェンス・モーラー)」。
^ 「ファイルシステムライブラリの提案(Beman Dawes)」。
^ 「並列処理TSは標準化する必要があります」。
^ 「C ++ 17、v5の数学的特殊関数」(PDF)。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§23.7。
^ 「バイト型の定義」(PDF)。
^ 「N4659:ワーキングドラフト、プログラミング言語C ++の標準」(PDF)。§23.15.8。
^ 「PMR(多形メモリリソース)の詳細-NicoJosuttis」。
^ 「GCCでのC ++標準のサポート-GNUプロジェクト-フリーソフトウェアファウンデーション(FSF)」。gcc.gnu.org。
^ 「Clang-C ++ 17、C ++ 14、C ++ 11およびC ++ 98ステータス」。clang.llvm.org。
^ corob-msft。「VisualC ++言語適合性」。docs.microsoft.com。
^ 「発表:MSVCはC ++標準に準拠しています」。
^ 「第1章ステータス」。gcc.gnu.org。
^ 「libc ++ C ++ 17ステータス」。llvm.org。
^ 「発表:MSVCはC ++標準に準拠しています」。devblogs.microsoft.com。