C ++ 17の新機能は何ですか?


1007

C ++ 17の機能が完全になったため、大きな変更が発生する可能性はほとんどありません。何百もの提案がC ++ 17に対して提案されました。

C ++ 17でC ++に追加された機能はどれですか?

「C ++ 1z」をサポートするC ++コンパイラーを使用している場合、コンパイラーがC ++ 17に更新すると、これらの機能のうちどれが使用可能になりますか?


26
Clangによる機能の完全なリスト:ライブラリコア言語
Kerrek SB、2016

3
このブログのボストには素晴らしい要約があります:bfilipek.com/2017/01/cpp17features.html
atb

13
C ++ 14からC ++ 17への主な変更点のリストについては、C ++ 14とC ++ 17の間の公式のDIS(P0636r0)ドキュメントを参照してください。
jotik

1
@RaghavNavada素晴らしい!C ++ 20セクションは維持されていますか?#53がありますが、閉まっています...
LF

このサイトのすべてにen.cppreference.com/w/cppが必要なバージョンでマークされています。
jw_

回答:


1266

言語機能:

テンプレートと汎用コード

ラムダ

の属性

構文のクリーンアップ

よりクリーンなマルチリターンとフロー制御

  • 構造化バインディング

    • 基本的には、ファーストクラスstd::tieauto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 変数itを作成insertedし、pairそれからmap::insert返されるから推定型を使用します。
    • タプル/ペアのような&std::arrayと比較的フラットな構造体で動作します
    • 標準で実際に命名された構造化バインディング
  • if (init; condition) そして switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • をブール値に変換できないif(decl)場合に適切に拡張しdeclます。
  • 範囲ベースのforループの一般化

    • ほとんどの場合、センチネル、または開始反復子と同じタイプではない終了反復子をサポートしているように見えます。これは、ヌル終了ループなどに役立ちます。
  • constexprの場合

    • ほとんど一般的なコードを簡素化するために多くの要求された機能。

その他

ライブラリの追加:

データ型

  • std::variant<Ts...>

    • 私が最後にチェックしたほとんど常に空でない?
    • タグ付きユニオンタイプ
    • {素晴らしい|便利}
  • std::optional

    • たぶん何かを持っている
    • 途方もなく便利
  • std::any

    • 何でも保持(コピー可能)
  • std::string_view

    • std::string 文字配列への参照または部分文字列のように
    • 二度と取らないでくださいstring const&。また、何十億倍も速く解析することができます。
    • "hello world"sv
    • constexpr char_traits
  • std::byte 彼らがかむことができるよりも多くオフ。

    • 整数でも文字でもなく、データのみ

ものを呼び出す

ファイルシステムTS v1

新しいアルゴリズム

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • スレッド化の目的で追加され、スレッド化されていない場合でも公開されます

スレッディング

(一部)Library Fundamentals TS v1は上または下でカバーされていません

コンテナの改善

スマートポインターの変更

その他のstdデータ型の改善:

その他

特徴

非推奨

Isocpp.orgはは、C ++ 14以降の変更の独立したリストがあります。それは部分的に略奪されました。

当然、TSの作業は並行して行われるため、完全に熟していないTSの中には、次の反復を待つ必要があるものもあります。次の反復のターゲットは、以前に計画されたC ++ 20であり、噂が暗示するC ++ 19ではありません。C ++ 1Oは回避されました。

このreddit投稿このreddit投稿から取得した最初のリストリンクはグーグル経由または上記のisocpp.orgページから追加されています。

SD-6機能テストリストから略奪された追加のエントリ。

clangの機能リストライブラリ機能リストは略奪されます。これはC ++ 17ではなくC ++ 1zであるため、信頼性が低いようです。

これらのスライドには、他の場所には欠けている機能がいくつかありました。

「何が削除されたか」は尋ねられませんでしたが、C ++ 17でC ++から削除されたいくつかの((主に?)以前は非推奨)の短いリストを次に示します。

削除:

言い換えがありました。これらがコードに影響するのか、それとも標準のクリーンアップなのかはわかりません。

上記にまだ統合されていない論文:

  • P0505R0(constexprクロノ)

  • P0418R2(アトミック調整)

  • P0512R0(テンプレート引数の控除の微調整)

  • P0490R0(構造化バインディングの調整)

  • P0513R0(に変更std::hash

  • P0502R0(並列例外)

  • P0509R1(例外処理の更新制限)

  • P0012R1(例外仕様を型システムの一部にする)

  • P0510R0(バリアントの制限)

  • P0504R0(オプション/バリアント/任意のタグ)

  • P0497R0(共有ptr調整)

  • P0508R0(構造化バインディングノードハンドル)

  • P0521R0(共有ポインターの使用カウントと固有の変更?)

仕様変更:

さらに参照:


2
ええと、memory_order_consume正式に廃止されたようではありません。これは単に注記で推奨されていません。これについて言及するのは理にかなっているかもしれません(たとえば、括弧が付いています)?
LF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.