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



c++20 (1)

C ++ 17は完全な機能を備えているため、大きな変更はほとんどありません。 C ++ 17の何百もの提案が提出されました。

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

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


言語機能:

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

ラムダ

属性

構文のクリーンアップ

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

  • 構造化バインディング

    • 基本的に、ファーストクラスの std::tieauto
    • 例:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • 変数を作成し、 map::insert が返す pair から推定タイプで map::insert ます。
    • tuple / pair-likesおよび std::array sおよび比較的フラットな構造体で動作します
    • 標準の実際の名前付き 構造化バインディング
  • if (init; condition) および switch (init; condition)

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

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

    • ほぼ一般的なコードを簡素化するための多くの要求機能。

その他

ライブラリの追加:

データ型

  • std::variant<Ts...>

    • 最後にチェックしたのはほとんど常に空ではありませんか?
    • タグ付きユニオンタイプ
    • {awesome | useful}
  • std::optional

    • たぶん何かの一つを保持している
    • 途方もなく便利
  • std::any

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

    • 文字配列または部分文字列への参照のような std::string
    • string const& 再度使用しないでください。 また、解析を何千倍も高速化できます。
    • "hello world"sv
    • constexpr char_traits
  • std::byte は、噛むことができる範囲を超えています。

    • 整数でも文字でもない、単なるデータ

ものを呼び出す

  • std::invoke
    • 1つの構文で任意の呼び出し可能オブジェクト(関数ポインター、関数、メンバーポインター)を呼び出します。 標準のINVOKEコンセプトから。
  • std::apply
    • 関数のようなタプルを受け取り、タプルを呼び出しにアンパックします。
  • std::make_from_tuple std::apply はオブジェクト構築に std::apply されます

  • is_invocableis_invocable_rinvoke_result

ファイルシステムTS v1

新しいアルゴリズム

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

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

スレッディング

(の一部)上または下でカバーされていない std::apply

コンテナの改善

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

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

その他

特性

非推奨

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

当然のことながら、TSの作業は並行して続行されるため、次の反復を待たなければならない、まだ完熟していないTSがいくつかあります。 次の反復のターゲットは、以前に計画されたC ++ 20であり、一部の噂が暗示しているC ++ 19ではありません。 C ++ 1Oは回避されました。

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

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

clangの機能リスト library は、次に略奪されます。 これはC ++ 17ではなくC ++ 1zであるため、信頼できるとは思えません。

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

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

削除されました:

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

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

  • P0505R0 (constexprクロノ)

  • P0418R2 (アトミックな調整)

  • P0512R0 (テンプレート引数 P0512R0 調整)

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

  • P0513R0 std::hash への変更)

  • P0502R0 (並列例外)

  • P0509R1 (例外処理に関する制限の更新)

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

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

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

  • P0497R0 (共有ptr調整)

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

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

仕様変更:

詳細なリファレンス:





c++17