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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

2
コンパイル時にタイプ `const char *`の2つの文字列を連結することは可能ですか?
明らかに、constexpr関数内で2つの文字列リテラルを連結できますが、文字列リテラルと別の文字列リテラルを連結するとどうなるでしょうか。constexpr以下のコードのよう関数することはどうでしょうか。 template <class T> constexpr const char * get_arithmetic_size() { switch (sizeof(T)) { case 1: return "1"; case 2: return "2"; case 4: return "4"; case 8: return "8"; case 16: return "16"; default: static_assert(dependent_false_v<T>); } } template <class T> constexpr std::enable_if_t<std::is_arithmetic_v<T>, const char *> make_type_name() { const char * …
12 c++  c++17 

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
ここで列挙型変数が右辺値になるのはなぜですか?
例: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } これをコンパイルすると、次のエラーが発生します。 <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …

1
非パブリックタイプのパブリックエイリアス
有効なC ++かどうか疑問に思います。 class Test { struct PrivateInner { PrivateInner(std::string const &str) { std::cout << str << "\n"; } }; public: using PublicInner = PrivateInner; }; //Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private type, …

1
関数定義のクラス外宣言子でクラス名を完全に修飾することはできません
このプログラムは、望ましくない解析の貪欲な行き止まりをもたらします。 struct float4x4 {}; class C { float4x4 M(); }; float4x4 ::C::M() { return float4x4{}; } :8:1:エラー:「float4x4」に「C」という名前のメンバーがありません。単に「C」という意味ですか? float4x4 :: C :: M() ^ ~~~~~~~~~~~ これは、末尾の戻り値の型を使用して「修正」できます。 auto ::C::M() -> float4x4 {} 今はすべて良い。 それで、heading-return-type宣言子構文を使用するときにクラス名を完全に修飾できないと思いますか?

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 …

5
順序付けられた数値の効率的な安定合計
浮動小数点正数のかなり長いリスト(std::vector<float>、サイズ〜1000)があります。番号は降順でソートされます。順序に従ってそれらを合計すると: for (auto v : vec) { sum += v; } ベクトルの終わり近くはsumより大きいので、数値の安定性の問題が発生する可能性がありますv。最も簡単な解決策は、ベクトルを逆の順序でトラバースすることです。私の質問は、前向きの場合と同様に効率的ですか?キャッシュが不足しますか? 他のスマートなソリューションはありますか?

2
アトミックのベクトルの初期化
考慮してください: void foo() { std::vector<std::atomic<int>> foo(10); ... } fooの内容は有効ですか?または、明示的にループして初期化する必要がありますか?私はGodboltを確認しましたが、問題はないようですが、この点については標準が非常に混乱しているようです。 std ::ベクトルコンストラクタは、それが挿入言うデフォルトの挿入のインスタンスstd::atomic<int>は、初期化値ビア配置をnew。 値の初期化のこの効果は当てはまると思います: 2)Tがユーザー提供でも削除でもないデフォルトコンストラクターを持つクラス型(つまり、暗黙的に定義またはデフォルト化されたデフォルトコンストラクターを持つクラスである可能性がある)である場合、オブジェクトはゼロ初期化され、その後重要なデフォルトコンストラクターがある場合はdefault-initialized。 したがって、アトミックはゼロで初期化されているように思えます。だから問題は、std::atomic<int>有効なオブジェクトの結果のゼロ初期化ですか? 答えは「実際にはそうですが、実際には定義されていません」と思いますか? 注:この回答は、それがゼロで初期化されていることには同意していますが、それがオブジェクトが有効であることを意味するかどうかについては、実際には言っていません。
12 c++  vector  atomic 


1
このコードがg ++でコンパイルするのにとても時間がかかるのはなぜですか?
次のコードを検討してください。 template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } 次のBashコマンドでg ++によるコンパイルをベンチマークするとき(g ++ 8.3.0を使用) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null done 次の出力が表示されます。 1,0.03 2,0.03 …

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 …

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