タグ付けされた質問 「c++20」

C ++ 20は、C ++ 17以降のバージョンのC ++のターゲットです。このタグは、C ++ 20で予定されているC ++機能に関する質問には(C ++タグとともに)使用する必要があります。

1
存続期間が終了したオブジェクトのメンバー関数コルーチンを再開するのはUBですか?
この質問は、このコメントから生じています:C ++ 20コルーチンのラムダ寿命の説明 この例について: auto foo() -> folly::coro::Task<int> { auto task = []() -> folly::coro::Task<int> { co_return 1; }(); return task; } したがって、問題は、によって返されたコルーチンを実行するfooとUBになるかどうかです。 (オブジェクトのライフタイムが終了した後の)メンバー関数の「呼び出し」はUBです。http://eel.is/c++draft/basic.life#6.2 ...オブジェクトが配置される、または配置された保管場所のアドレスを表すポインターは、限られた方法でのみ使用できます。[...]次の場合、プログラムは未定義の動作をします。 [...] -ポインタは非静的データメンバにアクセスしたりするために使用されるオブジェクトの非静的メンバ関数を呼び出し、または ただし、この例では: ()ラムダの有効期間中にラムダの演算子が呼び出されます その後、中断され、 次にラムダが破壊され、 その後、メンバー関数(演算子())はある時点で再開されます。 この再開は未定義の動作と見なされますか?

1
不特定の暗黙的なオブジェクトの作成
以来P0593低レベルのオブジェクトの操作のためのオブジェクトの暗黙の作成は、オブジェクトが現在作成され、承認された暗黙的に C ++ 20で。 具体的に提案により導入された文言は、(のような特定の操作が可能にstd::malloc)自動的に特定の種類のオブジェクトの寿命を作成して開始するには、いわゆる暗黙の一生のタイプ、場合このようなオブジェクトの導入は持っているそれ以外の場合は未定義の動作でプログラムを引き起こします定義された動作。[intro.object] / 10を参照してください。 ドラフトはさらに、プログラムで定義された動作を与えるために暗黙的に作成できるそのようなオブジェクトの複数のセットがある場合、これらのセットのどれが作成されるかは不特定であると述べています。(関連する文は、私がアクセスできた最後の提案リビジョンR5には存在しないようですが、ドラフトコミットにあります。) 暗黙的に作成されたオブジェクトセットのこの選択が観察可能なプログラムは実際にありますか?言い換えると、この新しいルールを通じて、定義されているが特定されていない動作を伴うプログラムがあり、(複数の可能なオブジェクトのうち)作成された暗黙オブジェクトのタイプのセットを出力から推測できるようになっていますか? または、この文は、抽象的なマシンでのプログラムの実行を(観察可能な影響なしに)明確にすることだけを目的としていましたか?

1
shift_right()はC ++ 20でどのように実装される予定ですか?
C ++ 20では、<algorithm>ヘッダは、2つの新しいアルゴリズムを獲得:shift_left()およびshift_right()。どちらもLegacyForwardIteratorを受け入れます。についてはshift_left()、「iから開始する順番で移動する」と明記されている​0。の場合shift_right()、「ForwardItLegacyBidirectionalIteratorの要件を満たしている場合、移動はi最初から降順で実行される」と指定されていますlast - first - n - 1。 私は実装するのにかなり簡単な方法を考えることができますshift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; } return …

4
集約の初期化のために空の基本クラスを非表示にする
次のコードを検討してください。 struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } これは、Bを初期化する方法ですB<int, 3> b = { {}, {1, 2, 3} }; 。基本クラスの不要な空の{}を避けたいのです。ここでJarod42によって提案された解決策がありますが、要素のデフォルトの初期化では機能しません。B<int, 3> b = {1, 2, 3};問題B<int, 3> b = {1};はありませんが、デフォルトb.data[1]でb.data[2]はありません。デフォルトで0に初期化されていないため、コンパイラエラーが発生します。基本クラスを構築から「隠す」方法はありますか(またはc ++ 20で存在するでしょう)?

1
-fno-char8_tに相当するMSVCは何ですか?
C ++ 20では、u8文字列リテラルはchar8_t型に基づいています。それらは故意にchar const*これ以上変換しません: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 もちろん、C ++ 20に移行する際の最終的な目標は、新しい動作に完全に対応することです(上記の例では、のタイプを変更しstrます)。ただし、サードパーティのライブラリのため、これはすぐに実行できないことがよくあります。 導入と「改善」を 提案する提案は、それをchar8_t予測し、clangとgccには-fno-char8_t、古い動作に切り替えるフラグがあります(他のC ++ 20機能は引き続き利用可能です)。 2番目の提案は、Microsoftが同様のフラグに従い、追加するという期待を設定していますが、設定方法を見つけることができませんでした(少なくともVS 2019、バージョン16.4)。 では、MSVCと同等のものは誰か知ってい-fno-char8_tますか?

1
参照による `constexpr`メンバー関数の呼び出し-clang vs gcc
次の例を考えてみます(スニペット(0)): struct X { constexpr int get() const { return 0; } }; void foo(const X& x) { constexpr int i = x.get(); } int main() { foo(X{}); } 上記の例は、g++以前のすべてのバージョンでコンパイルされg++ 10.x、でコンパイルされることはありませんclang++。エラーメッセージは次のとおりです。 error: 'x' is not a constant expression 8 | constexpr int i = x.get(); | godbolt.orgの実例 ただしx、の本体で定数式が使用されることはないため、エラーの種類には意味がありますfoo。 X::get()マークされてconstexprおり、の状態には依存しませんx。 に変更const …

2
パラメーターの順序にとらわれないstd :: same_asの一般化された形式(つまり、2つ以上の型パラメーター)を実装する方法は?
バックグラウンド 概念std::same_asは順序にとらわれない(つまり、対称)ことを知っています。std::same_as<T, U>これは、std::same_as<U, T>(関連する質問)と同等です。この質問では、より一般的なものを実装したいと思います。それはtemplate <typename ... Types> concept same_are = ...、パック内の型Typesが互いに等しいかどうかをチェックします。 私の試み #include <type_traits> #include <iostream> #include <concepts> template <typename T, typename... Others> concept same_with_others = (... && std::same_as<T, Others>); template <typename... Types> concept are_same = (... && same_with_others<Types, Types...>); template< class T, class U> requires are_same<T, U> void foo(T …

2
非原子型に対してstd :: atomic_refはどのように実装されていますか?
次のプロパティを適用するのはかなり難しいように思われるので、非アトミックオブジェクトに対してどのようにstd::atomic_ref効率的に(std::mutexオブジェクトごとに1 つ)実装できるのかと思います。 atomic_refを介してオブジェクトに適用されるアトミック操作は、同じオブジェクトを参照する他のatomic_refを介して適用されるアトミック操作に対してアトミックです。 特に、次のコード: void set(std::vector<Big> &objs, size_t i, const Big &val) { std::atomic_ref RefI{objs[i]}; RefI.store(val); } 同じタイプのすべてのオブジェクトによって共有される大きなマスターロックでない限りstd::atomic_ref、同じものを毎回選択する必要があるため、実装は非常に難しいようstd::mutexです。 何か不足していますか?または、各オブジェクトは実装std::atomic_refを担当するため、アトミックであるか、std::mutex?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.