C++17 は現在機能が完全であるため、大きな変更は発生しないと思われます。C++17 については何百もの提案が提出されました。
これらの機能のうち、C++17 で C++ に追加されたのはどれですか?
「C++1z」をサポートする C++ コンパイラを使用する場合、コンパイラが C++17 に更新されると、どの機能が利用できるようになりますか?
ベストアンサー1
言語機能:
テンプレートと汎用コード
-
- 関数がテンプレート引数を推測するのと同様に、コンストラクタはクラスのテンプレート引数を推測できるようになりました。
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- 任意の(非型テンプレート引数)型の値を表します。
ラムダ
-
- ラムダ式は条件を満たしていれば暗黙的にconstexprである。
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
属性
using
属性で属性の名前空間を繰り返さなくて済むようにするためです。コンパイラは今認識できない非標準属性を無視する必要がある。
- C++14 の文言により、コンパイラーは不明なスコープ属性を拒否できるようになりました。
構文のクリーンアップ
-
- インライン関数のように
- コンパイラはインスタンスがインスタンス化される場所を選択する
- 静的 constexpr 再宣言を非推奨にする、暗黙的にインラインになりました。
いいえ
throw
、ただしthrow()
、throw()
そしてnoexcept(true)
。
クリーナーマルチリターンとフロー制御
-
- 基本的にファーストクラス
std::tie
でauto
- 例:
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)
- を、bool に適切に変換できない
if(decl)
ケースに拡張します。decl
-
- 主にセンチネル、つまり開始反復子と同じ型ではない終了反復子をサポートしているようで、これは null 終了ループなどに役立ちます。
-
- ほぼ汎用的なコードを簡素化するための、多くの要望があった機能。
その他
-
- ついに!
- すべてのケースではありませんが、省略と呼ばれる「単に何かを作成している」構文と「本物の省略」を区別します。
-
- 関数の引数は含まれませんが、関数の引数評価のインターリーブは禁止されました
- 壊れたコードの大半を動作させ、
.then
将来の作業も可能にします。
前進保証(FPG)(また、並列アルゴリズムのためのFPG)
- これは「実装によってスレッドが永久に停止することはない」ということを言っていると思いますか?
u8'U', u8'T', u8'F', u8'8'
文字リテラル(文字列が既に存在)-
- ヘッダーファイルのインクルードがエラーになるかどうかをテストする
- 実験版から標準版への移行がほぼシームレスになります
継承されたコンストラクタいくつかのコーナーケースの修正(品番行動の変化の例については
ライブラリの追加:
データ型
-
- 最後に確認したときは、ほとんど常に空ではありませんでしたか?
- タグ付きユニオン型
- {素晴らしい|役に立つ}
-
- 何かを持っているかもしれない
- 非常に便利
-
- コピー可能なものなら何でも1つ保持する
-
std::string
文字配列や部分文字列への参照のような- 二度と取る必要はありません
string const&
。また、解析を何十億倍も高速化できます。 "hello world"sv
- コンストラクター
char_traits
std::byte
彼らの手に余る仕事を。- 整数でも文字でもなく、単なるデータ
ものを呼び出す
-
- 任意の呼び出し可能オブジェクト (関数ポインター、関数、メンバー ポインター) を 1 つの構文で呼び出します。標準の INVOKE コンセプトから。
-
- 関数のようなものとタプルを受け取り、タプルを呼び出しに展開します。
std::make_from_tuple
、std::apply
オブジェクトの構築に適用されるis_invocable
、、is_invocable_r
invoke_result
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
- 非推奨
result_of
is_invocable<Foo(Args...), R>
は、「Foo
を呼び出してArgs...
、 と互換性のあるものを取得できますかR
」であり、 はR=void
デフォルトです。invoke_result<Foo, Args...>
std::result_of_t<Foo(Args...)>
どうやら混乱は少ないようですね?
ファイル システム TS v1
新しいアルゴリズム
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
スレッド化の目的で追加され、スレッド化して使用していない場合でも公開されます
スレッド
-
- 時間制限がないので、必要がない場合はより効率的です。
atomic<T>
::is_always_lockfree
-
std::lock
一度に複数のミューテックスをロックする際の手間を軽減します。
-
- リンクされた論文は2014年のもので、古い可能性があります
- アルゴリズムの並列バージョン
std
および関連機械
(の部品)ライブラリの基礎 TS v1上記または下記に記載されていない
[func.searchers]
そして[alg.search]
- 検索アルゴリズムとテクニック
-
- 多態的アロケータ、
std::function
アロケータ用 - いくつかのそれに付随する標準メモリリソース。
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- 多態的アロケータ、
std::sample
、範囲からサンプリングしますか?
コンテナの改善
try_emplace
そしてinsert_or_assign
- 誤った移動/コピーが悪影響を及ぼすようなケースでは、より良い保証が得られる
map<>
、、、unordered_map<>
およびset<>
のスプライシングunordered_set<>
- コンテナ間でノードを安価に移動します。
- コンテナ全体を安価にマージします。
非定数
.data()
文字列用。非会員
std::size
、、std::empty
std::data
- のように
std::begin
/end
- のように
関数
emplace
群作成されたオブジェクトへの参照を返すようになりました。
スマートポインタの変更
unique_ptr<T[]>
修正その他unique_ptr
微調整。weak_from_this
そして、いくつかはこれから共有される
その他のstd
データ型の改善:
{}
建設std::tuple
およびその他の改良- 簡単にコピー可能な参照ラッパーパフォーマンスの向上が可能
その他
C++17ライブラリは以下に基づいていますC99 の代わりに C11
予約
std[0-9]+
済み将来の標準ライブラリ-
std
ほとんどの実装で既に公開されているユーティリティコード
-
- 科学者はそれを気に入るかもしれない
-
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
だいたい
-
- デストラクタから安全な場合にのみスローしたい場合に必要です
-
- テンプレートを書くときに驚くほど便利
-
- と同様だ
std::less<void>
が、スマートポインタが内容に基づいてソートする
- と同様だ
std::is_contiguous_layout効率的なハッシュ化に役立つ
std::to_chars/std::from_chars、高性能、ロケールに依存しない数値変換。最終的に人間が読める形式(JSON など)にシリアル化/デシリアル化する方法
std::default_order 、間接参照(いくつかのコンパイラのABIが壊れる名前が誤っているため削除されました。std::less
。memory_order_consume
、使用を推奨する言語を追加しましたmemory_order_acquire
特性
非推奨
- いくつかのCライブラリ、
<codecvt>
result_of
、 交換されたinvoke_result
shared_ptr::unique
スレッドセーフではない
Isocpp.orgにはC++14 以降の変更点の独立したリストがありますが、一部は略奪されています。
当然ながら、TS の作業は並行して進められているため、まだ完成していない TS がいくつかあり、それらは次のイテレーションまで待たなければなりません。次のイテレーションのターゲットは、噂にもあった C++19 ではなく、以前の計画どおり C++20 です。C++1O は回避されました。
当初のリストはこのRedditの投稿そしてこのRedditの投稿グーグル検索または上記の isocpp.org ページからリンクが追加されました。
略奪された追加エントリSD-6機能テストリスト。
clangの機能一覧そしてライブラリ機能リスト次に略奪されるのは、C++17ではなくC++1zなので、信頼できないようです。
これらのスライド他の部分には欠けている機能がいくつかありました。
「何が削除されたか」は尋ねられていませんが、C++17 で C++ から削除されたいくつかの項目 ((ほとんど?) 以前から非推奨だったもの) の短いリストを以下に示します。
削除:
register
、将来の使用のために予約されているキーワードbool b; ++b;
- トリグラフ
- もしまだ必要なら、それらは言語の一部ではなく、ソースファイルのエンコーディングの一部になります。
- iOS エイリアス
- auto_ptr、古い
<functional>
もの、random_shuffle
- アロケータ
std::function
言い換えがありました。これがコードに何らかの影響を与えるのか、それとも標準の単なるクリーンアップなのかはわかりません。
上記にまだ統合されていない論文:
品番(constexpr クロノ)
P0418R2(アトミック微調整)
品番(テンプレート引数の推論の調整)
品番(構造化バインディングの調整)
品番(に変更
std::hash
)品番(例外は並行)
品番(例外処理の制限の更新)
品番(例外仕様を型システムの一部にする)
品番(バリアントの制限)
品番(オプション/バリアント/任意のタグ)
品番(共有ptr調整)
品番(構造化バインディング ノード ハンドル)
品番(共有ポインタの使用回数と固有の変更?)
仕様変更:
さらに詳しい情報:
https://isocpp.org/files/papers/p0636r0.html
- ここでは「既存の機能の変更」に更新する必要があります。