[解決済み】C++17の新機能は何ですか?
質問
C++17は機能が完成しているので、大きな変更はなさそうです。C++17には何百もの提案がなされている。
C++17でC++に追加された機能はどれですか?
"C++1z"をサポートするC++コンパイラを使用する場合、コンパイラがC++17にアップデートしたときに利用できるようになる機能はどれでしょうか?
どのように解決するのですか?
言語の特徴
テンプレートと汎用コード
-
- 関数がテンプレート引数を推論するのと同じように、コンストラクタもクラスのテンプレート引数を推論できるようになりました。
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- 任意の(タイプテンプレート引数でない)型の値を表す。
ラムダ
-
- ラムダは、以下の条件を満たす場合、暗黙のうちにconstexprとなります。
-
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
-
属性
-
using
属性で を使用すると、属性の名前空間を繰り返す必要がなくなります。 -
コンパイラは、現在 認識できない非標準の属性を無視する必要があります。 .
- C++14 の表現では、コンパイラは未知のスコープ付き属性を拒否することができました。
シンタックスクリーンアップ
-
インライン関数と同様
-
コンパイラはインスタンスを生成する場所を選択します。
-
非推奨 静的 constexpr redeclaration 暗黙のうちにインライン化されるようになりました。
-
シンプル
static_assert(expression);
文字列を含まない -
いいえ
throw
なければthrow()
で、かつthrow()
はnoexcept(true)
.
クリーナーマルチリターンとフローコントロール
-
基本的にファーストクラス
std::tie
でauto
-
例 *
const auto [it, inserted] = map.insert( {"foo", bar} );
* 変数を作成するit
とinserted
から型が推測されます。pair
そのmap::insert
を返します。 -
Tuple/pair-likes & で動作します。
std::array
と比較的フラットな構造体 -
実際の名称 構造化バインディング 標準では
-
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
-
を拡張する。
if(decl)
を使用する場合decl
は賢明にconvertible-to-boolされない。 -
- センチネル、または開始イテレータと同じ型でない終了イテレータのサポートが主であるように見えます。
-
ほぼ一般的なコードを簡素化するために、多くの要望があった機能です。
その他
-
- ついに登場!
- すべての場合ではありませんが、エリシオンと呼ばれていたものを単に作成しただけの構文と、本物のエリシオンとが区別されます。
-
一部の)式の評価順序を修正しました。 一部の 修正
- 関数引数を含まないが、関数引数評価のインターリーブが禁止された
-
壊れたコードの束をほとんど動作するようにし、また
.then
今後の作業について
-
前方進展保証(FPG)(以下、「前方進展保証」ともいう。 並列アルゴリズムのためのFPG )
-
これは、"実装がスレッドを永遠に停止させないかもしれない"と言っているのではないでしょうか?
-
u8'U', u8'T', u8'F', u8'8'
文字リテラル(文字列は既に存在する) -
- ヘッダーファイルのインクルードがエラーになるかどうかのテスト
- experimental から std への移行をほぼシームレスにします。
-
継承されたコンストラクタ は、いくつかのコーナーケースを修正しました ( P0136R0 動作変更の例)
ライブラリの追加。
データ型
-
ほぼ常に空でないことを確認しましたか?
-
タグ付きユニオンタイプ
-
{すごい|便利}。
-
- たぶん、何か1つ持っている
- バカバカしいほど便利
-
- コピー可能なものなら何でも1個収納可能
-
-
std::string
文字配列への参照や部分文字列のように -
は絶対に取らないようにしましょう。
string const&
をもう一度。 また、パースも何億倍も速くなります。 -
"hello world"sv
-
constexpr
char_traits
-
-
std::byte
を、噛み切れないほどの量にした。- 整数でも文字でもない、ただのデータ
呼び出すもの
-
- 1つの構文で任意の callable (関数ポインタ、関数、メンバーポインタ)を呼び出す。 標準的な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
-
[class.directory_iterator]
そして[class.recursive_directory_iterator]
-
fstream
で開くことができます。path
と同じようにconst path::value_type*
の文字列を使用します。
新しいアルゴリズム
-
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
datatypeの改良。
-
{}
の構築std::tuple
およびその他の改善 - TriviallyCopyable reference_wrapper (トリビアルコピー可能なリファレンスラッパー) パフォーマンスを向上させることができる
その他
-
C++17のライブラリは、以下のものをベースにしています。 C99の代わりにC11
-
予約
std[0-9]+
に対して 将来の標準ライブラリ -
ユーティリティコード
std
実装を公開 -
科学者が好むかもしれない
-
-
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
おおよそ
-
-
- デストラクタから安全な場合のみ投げる場合は必要です。
-
- テンプレートを書くときに意外と便利
-
-
のように
std::less<void>
しかし、スマートポインタは内容に基づいてソートされます。
-
のように
-
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
-
std::is_contiguous_layout 効率的なハッシュ化に有効
-
std::to_chars/std::from_chars 最後に、人間が読める形式 (JSON & co) にシリアライズ/デシリアライズする方法です。
-
std::default_order に対する間接的な
std::less
. ( 一部のコンパイラのABIを破壊する を削除しました)。 -
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 feature-test リスト。
clangの機能一覧 と ライブラリ機能一覧 は次に略奪される。 C++17ではなくC++1zなので、これは信頼できなさそうです。
このスライドは は、他で欠けている機能がありました。
何が削除されたのか"は問われませんでしたが、C++17でC++から削除されたいくつかのもの(主に?)以前の非推奨のものを簡単にリストアップします。
削除されました。
-
register
将来の使用のために予約されたキーワード -
bool b; ++b;
-
トリグラフ
- それでも必要な場合は、言語の一部ではなく、ソースファイルのエンコーディングの一部になりました。
- iosエイリアス
-
auto_ptr, old
<functional>
のものです。random_shuffle
-
のアロケータを使用します。
std::function
言い直しがありました。 これらがコードに影響を与えるものなのか、それとも単に規格の整理なのかは不明です。
まだ上記に統合されていない論文。
-
P0505R0 (constexpr chrono)
-
P0418R2 (アトム調整)
-
P0512R0 (テンプレート引数控除調整)
-
P0490R0 (構造化バインディングの調整)
-
P0513R0 (に変更)。
std::hash
) -
P0502R0 (並列例外)
-
P0509R1 (例外処理に関する制限の更新)
-
P0012R1 (例外指定を型システムの一部にする)。
-
P0510R0 (バリアントに関する制限)
-
P0504R0 (オプション/変量/任意のタグ)
-
P0497R0 (共有 ptr の調整)
-
P0508R0 (構造化バインディングノードハンドル)。
-
P0521R0 (共有ポインタの使用回数とユニークな変更?)
仕様の変更
その他の参考資料
-
https://isocpp.org/files/papers/p0636r0.html
- ここは、"既存機能の修正"に更新する必要があります。
関連
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された