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

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

3
std :: arrayを使用したstd :: bit_cast
彼の最近の講演で、「++現代Cでタイプpunning」ティムールDoumlerは言ったそのstd::bit_castビットを鋳造するために使用することはできませんfloatにunsigned char[4] Cスタイルの配列を関数から返すことができないため。のstd::memcpyようなものreinterpret_cast<unsigned char*>(&f)[i]が明確になるときは、C ++ 23(以降)を使用するか待つ必要があります。 C ++ 20では、std::arraywith std::bit_cast、 float f = /* some value */; auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f); Cスタイルの配列の代わりにfloat?

1
バージョン間でC ++の式の型が変更されたのはなぜですか?
私はC ++の式のタイプを理解しようとしますが、C ++ドラフトを消化するのは非常に難しく、したがって他のリソースを好むので、読むほど混乱します。 C ++バージョン間の表現と定義が大幅に変更されています。 以下では、以下のドラフトを参照します。 C ++ 11 [ n3690 ](最終ドラフト) C ++ 17 [ n4659 ](最終ドラフト) C ++ 20 [ n4835 ](現在のドラフト) C++11 3.10左辺値と右辺値 ... prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り値の型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、trueなどのリテラルの値もprvalueです。—最後の例] C++17 3.10左辺値と右辺値 ... prvalueは、評価によってオブジェクトまたはビットフィールドを初期化するか、演算子のオペランドの値を、それが出現するコンテキストで指定されたとおりに計算する式です。 C++20 7.2.1値のカテゴリ* ... prvalueは、その評価がオブジェクトまたはビットフィールドを初期化する式、または演算子のオペランドの値を、それが出現するコンテキストまたはcv void型の式で指定されているように計算する式です。 言い回しの変更を理解し、いくつかの調整が行われますが、私にとっては定義全体が変更されます。誰かがこれを理解するのを手伝ってくれる?たとえば、prvalueがxvalueではないrvalueであるという文が削除されたのはなぜですか?または、なぜ役立つ例が削除されたのですか?
13 c++  c++11  c++14  c++17  c++20 

1
`equality_comparable_with`は` common_reference`を必要とする必要がありますか?
コンセプトは、equality_­comparable_with<T, U>タイプのオブジェクトを宣言することを目的とTし、U互いに等しく比較することができ、それらがある場合、これは予想される意味を持ちます。それはいいです。 ただし、この概念もcommon_reference_t<T&, U&>存在する必要があります。主な推進力common_referenceとそれに付随する機能は、プロキシイテレータを有効にし、そのようなイテレータ間のreferenceとの関係を表す場所を設けることvalue_typeです。 それは素晴らしいことですが... a Tとa Uが互いに等しいかどうかをテストできるかどうかをテストすることとは何ですか?なぜ標準はそれTを必要とし、Uそれらを等しく比較できるようにするために共通の参照関係を持っているのですか? これは、論理的に比較可能な共通参照関係を合理的に持たない2つのタイプを持つことが非常に困難な、奇妙な状況を作り出します。例えば、vector<int>およびpmr::vector<int>論理的には同等であるべきです。しかし、そうでなければ関係のない2つのタイプの間に妥当な共通参照がないため、そうなることはありません。

1
C ++ 20テンプレートクラスのクラス外定義
C ++のC ++ 20標準までは、テンプレートクラスのいくつかのプライベートメンバーを使用するクラス外の演算子を定義する場合、次のような構成を使用していました。 template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename T> constexpr bool operator==(T …
12 c++  templates  c++20 

1
キャプチャレスラムダは標準で空であることが保証されていますか?
テンプレート関数で他のラムダから空の(キャプチャレス)ラムダを識別する方法を探しています。現在C ++ 17を使用していますが、C ++ 20の回答にも興味があります。 私のコードは次のようになります: template<typename T> auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do stuff } } C ++標準(17または20)で、関数ポインターに変換可能なキャプチャレスラムダでもstd::is_empty歩留まりがtrueになることが保証されていますか? 例としてこのコードを見てください: auto a = []{}; // captureless auto b = [c = 'z']{}; // has captures …
12 c++  lambda  c++17  c++20 

1
クラス内の隣接するメンバーの重複を防ぐものは何ですか?
次の3つを検討してくださいstruct。 class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; intが4バイトである一般的なプラットフォームでは、サイズ、配置、およびパディングの合計1は次のとおりです。 struct size alignment padding -------- ------ ----------- --------- blub 8 4 3 blob 1 1 0 bla 12 4 6 …

1
LinuxパッケージマネージャーはC ++ 20モジュールをどのように処理しますか?
現在2020年になり、待望のC ++モジュール機能とともにC ++ 20が登場します。しかし、CppConでのいくつかの講演を見た後、特にLinuxパッケージマネージャー(pacman、apt、emergeなど)の場合、C ++モジュールが奇妙な場所にあることがわかりました。 私が学んだことから、C ++モジュールは コンパイラ依存 ClangでGCCによってビルドされたモジュールを使用することはできません GCC 9.1モジュールはGCC 9.2では機能しません 同じモジュールの多くの異なるバージョンを持つことができます 同じスコープにエクスポートされない限り 依存関係が更新された場合、モジュールを再構築する必要があります 私の問題は、すべてのローリングリリースディストリビューションで、コンパイラーが常に更新され、ユーザーが独自のコンパイラービルドを持っている可能性があることです。現在、コンパイラを更新するか、を更新することもできlibstdc++ます。しかし、モジュールのlibstdc++場合、コンパイラーの更新時に更新する必要があることを示唆しているようです。 パッケージマネージャーは、コンパイラーの更新時にSTLなどの更新をどのように処理しますか?コンパイラのすべてのバージョンに対してSTLモジュールのすべてのバージョンを構築することは現実的ではないと思います。また、ユーザーが独自のSTLモジュールを構築する必要はありません。

2
コンセプトを関数に渡す
概念はコンパイル時の述語として定義されているため、これらの述語をコンパイル時のアルゴリズムに実際に再利用することもできますか?たとえば、タプルのすべての型がコンセプトに準拠しているかどうかを確認することは可能でしょうか?私が見た限りでは、概念を関数に渡すことは決して不可能であり、そのため、これらの場合にテンプレートを使用することに戻ってきました。 #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, int>()); } 私がやりたいのは次のようなものなので、それを使用できるようにするために常にコンセプトをラップする必要はありません。 template<concept …

1
C ++ 20での後の実行時の決定に基づいて、異なる暗黙のオブジェクトが存在する可能性はありますか?
この質問は、最新のC ++ 20ドラフトへのP0593の追加に言及しています。 これが私の例です: #include <cstdlib> #include <cstdio> void foo(void *p) { if ( std::getchar() == 'i' ) { *(int *)p = 2; std::printf("%d\n", *(int *)p); } else { *(float *)p = 2; std::printf("%f\n", *(float *)p); } } int main() { void *a = std::malloc( sizeof(int) + sizeof(float) ); if …

4
非ブール戻り値との等価比較をオーバーロードすると、C ++ 20の重大な変更またはclang-trunk / gcc-trunkの回帰?
次のコードは、c ++ 17モードではclang-trunkで正常にコンパイルされますが、c ++ 2a(今後のc ++ 20)モードでは機能しません。 // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() { Meta res = (Foo{} != Foo{}); } また、gcc-trunkまたはclang-9.0.0でも問題なくコンパイルできます。https://godbolt.org/z/8GGT78 clang-trunkおよび-std=c++2a: <source>:12:19: error: use of overloaded …

1
スパンをconstexprにすることはできますか?
std :: spanのすべてのコンストラクターはconstexprと宣言されていますが、それらのいずれかをconstexprコンテキストで動作させることはできません。以下のconstexprのコメントを外すと、コンパイルエラーが発生します。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 

1
std :: spanに比較演算子がないのはなぜですか?
/ / プレーン配列などのstd::spanサブ領域への軽量リファレンスとして設計されていませんか?それらとの一貫性を保つために、APIに比較演算子も含めるべきではありませんか?除外の理由は何でしたか?std::vectorstd::array 注:比較演算子で、私はどちらかのフルセットを意味する(<、<=、...)、または宇宙船<=>
10 c++  std  c++20  std-span 

1
C ++ 20以降、割り当てられたストレージでのポインター演算は許可されていますか?
C ++ 20標準では、配列型は暗黙の存続時間型であると言われています。 非暗黙的なライフタイムタイプの配列を暗黙的に作成できるということですか?このような配列を暗黙的に作成しても、配列の要素は作成されませんか? このケースを考えてみます //implicit creation of an array of std::string //but not the std::string elements: void * ptr = operator new(sizeof (std::string) * 10); //use launder to get a "pointer to object" (which object?) std::string * sptr = std::launder(static_cast<std::string*>(ptr)); //pointer arithmetic on not created array elements well defined? …

1
C ++ 20でビューを使用してコンテナーを構築できますか?
範囲は、C ++ 20標準バージョンでC ++に導入されます。 私の質問:任意の範囲で(既存の)標準ライブラリコンテナを構築できますか?そしてさらに重要なのは、範囲ビューで? たとえば、これは: #include <vector> #include <iostream> #include <ranges> int main() { auto sq = [](int x) { return x * x; }; std::vector<int> vec { 3, 4, 5 }; std::vector<int> squares { std::ranges::views::transform(vec, sq) }; for(auto i : squares) { std::cout << i << ' '; …
10 c++  c++20  range-v3 

1
必要な式は、囲んでいるスコープの変数を「キャプチャ」することを許可されていますか?
次の例では、関数の引数を使用してrequire式を使用し、それらを使用する式が整形式であるかどうかをテストしています。require式は引数を取りません。関数スコープ内の変数を直接使用します。 #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); } 上記のコードは、Clangコンセプトブランチでコンパイルされます。ただし、GCC10はへの呼び出しのみを受け入れますResize。GCC9 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.