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

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

4
ジェネリック引数として特定のタイプを持つSTLコンテナー
特定のタイプのコンテナをstd::stringパラメータとして受け取る関数を作成する方法はありますか? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } そして、入力としてすべてのタイプのstlコンテナーに対してそれを呼び出しますか?上記のように? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);


2
std :: unordered_map operator []は、存在しないキーに対してゼロ初期化を行いますか?
cppreference.comによると、std::map::operator[]存在しない値についてはゼロ初期化を行います。 ただし、同じサイトではstd::unordered_map::operator[]、これに依存する例があることを除いて、のゼロ初期化について言及していません。 もちろん、これは単なる参考サイトであり、標準ではありません。それで、以下のコードは大丈夫ですか? #include <unordered_map> int main() { std::unordered_map<int, int> map; return map[42]; // is this guaranteed to return 0? }

2
C ++ 20の指定イニシャライザ
c ++ 20機能の1つである指定イニシャライザについて質問があります(この機能の詳細はこちら) #include <iostream> constexpr unsigned DEFAULT_SALARY {10000}; struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true …

3
コンパイラーはローカルvolatileを定数フォールドできますか?
この単純なコードを考えてみましょう: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 への潜在的な呼び出しgccもclang最適化もされていないことがわかりgます。これが私の理解で正しいです:抽象マシンは、と仮定することでvolatile一定の折りので変数は、(例えば、ハードウェア・マッピングされたことに起因する)いつでも変更される可能性falseに初期化をifチェックは間違っているだろう。 しかし、MSVCはへの呼び出しをg完全に排除します(volatileただし、読み取りと書き込みを維持します!)。これは標準に準拠した動作ですか? 背景:デバッグ出力をオンザフライでオン/オフできるようにするために、この種のコンストラクトを時々使用します:コンパイラは常にメモリから値を読み取る必要があるため、デバッグ中に変数/メモリを変更すると、それに応じて制御フローが変更されます。MSVC出力は値を再読み取りしますが、それを無視します(たぶん、定数の折りたたみやデッドコードの除去のため)、これはもちろん、ここでの私の意図を無効にします。 編集: 読み取りと書き込みの排除については、volatileここで説明します。コンパイラーがローカルの揮発性変数を最適化することを許可されていますか?(ネイサンに感謝!)標準は、これらの読み取りと書き込みが発生する必要があることを十分に明確に考えています。しかし、その議論は、コンパイラーがそれらの読み取りの結果を当然のこととして受け取り、それに基づいて最適化することが合法かどうかをカバーしていません。私はこれが標準では不十分/不特定であると思いますが、誰かが私を間違っていると証明したら私は幸せです。 もちろんx、問題を回避するために非ローカル変数を作成することもできます。この質問は、好奇心から外れています。

3
明示的な(ブール)のユースケースは何ですか
C ++ 20 は、コンストラクターが明示的にされているかどうかをコンパイル時に条件付きで選択する明示的な(ブール値)を導入しました。 以下は私がここで見つけた例です。 struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = 123; // OK foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true) foo c …
24 c++  c++20  explicit 


1
`decltype(static_cast <T>(…))`が常に `T`とは限らないのはなぜですか?
次のコードでは、最後のアサーションを除くすべてがパスしています。 template&lt;typename T&gt; constexpr void assert_static_cast_identity() { using T_cast = decltype(static_cast&lt;T&gt;(std::declval&lt;T&gt;())); static_assert(std::is_same_v&lt;T_cast, T&gt;); } int main() { assert_static_cast_identity&lt;int&gt;(); assert_static_cast_identity&lt;int&amp;&gt;(); assert_static_cast_identity&lt;int&amp;&amp;&gt;(); // assert_static_cast_identity&lt;int(int)&gt;(); // illegal cast assert_static_cast_identity&lt;int (&amp;)(int)&gt;(); assert_static_cast_identity&lt;int (&amp;&amp;)(int)&gt;(); // static assert fails } この最後のアサーションが失敗し、static_cast&lt;T&gt;常にを返すとは限らないのはなぜTですか?
24 c++  static-cast 

3
C ++ 20の概念:テンプレート引数が複数の概念に該当する場合、どのテンプレートの特殊化が選択されますか?
与えられた: #include &lt;concepts&gt; #include &lt;iostream&gt; template&lt;class T&gt; struct wrapper; template&lt;std::signed_integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "signed_integral" &lt;&lt; std::endl; } }; template&lt;std::integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "integral" &lt;&lt; std::endl; } }; int main() { wrapper&lt;int&gt; w; …

1
C ++のクラスのサイズがデータメンバーのパブリック/プライベートステータスに依存するのはなぜですか?
私が知っていることから、C ++のクラスのサイズは以下の要因に依存します- すべての非静的データメンバーのサイズ。 データメンバーの順序。 バイトパディングが有効かどうか。 直接の基本クラスのサイズ。 仮想機能の存在。 継承のモード(仮想継承)。 今私は以下のように2つのクラスを作成しました- class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; AとBIのサイズを確認する Aのサイズ:16 Bのサイズ:16 私の仮定は、クラスBのchar cがクラスAに残された「穴」に収容されることです。 しかし、私を混乱させているのは、メンバーを公開する以下のシナリオです class A{ public: int a; …

2
このテンプレート関数が期待どおりに動作しないのはなぜですか?
私はテンプレート関数について読んでいて、この問題で混乱しました: #include &lt;iostream&gt; void f(int) { std::cout &lt;&lt; "f(int)\n"; } template&lt;typename T&gt; void g(T val) { std::cout &lt;&lt; typeid(val).name() &lt;&lt; " "; f(val); } void f(double) { std::cout &lt;&lt; "f(double)\n"; } template void g&lt;double&gt;(double); int main() { f(1.0); // f(double) f(1); // f(int) g(1.0); // d f(int), this is surprising …

1
関数パラメーターのテンプレート引数プレースホルダーとしての「auto」
C ++ 20ではauto、関数パラメーター型を使用できます。 関数パラメーター型のautoテンプレート引数プレースホルダーとして使用することもできますか(似ていないが、C ++ 17 template &lt;auto&gt;の精神で)。 したがって、C ++ 20より前の次のコード: template&lt;typename First, typename Second&gt; void printPair(const std::pair&lt;First, Second&gt;&amp; p) { std::cout &lt;&lt; p.first &lt;&lt; ", " &lt;&lt; p.second; } 次のように書くことができます: void printPair(const std::pair&lt;auto, auto&gt;&amp; p) { std::cout &lt;&lt; p.first &lt;&lt; ", " &lt;&lt; p.second; } それはコンパイルし、概念の実験的なGCC実装でうまく動作します。 C ++ 20での正当な構文ですか?
22 c++  templates  auto  c++20 

3
参照からグローバル変数へのラムダ関数の可変キャプチャの動作の違い
ラムダを使用して、可変キーワードでグローバル変数への参照をキャプチャし、ラムダ関数の値を変更すると、コンパイラによって結果が異なることがわかりました。 #include &lt;stdio.h&gt; #include &lt;functional&gt; int n = 100; std::function&lt;int()&gt; f() { int &amp;m = n; return [m] () mutable -&gt; int { m += 123; return m; }; } int main() { int x = n; int y = f()(); int z = n; printf("%d %d %d\n", x, y, …

1
独自の初期化子での変数の使用
C ++ 20標準草案の[basic.scope.pdecl] / 1には、次の(非規範的)例が注記(プルリクエスト3580のマージ前の部分的な引用、この質問への回答を参照)に含まれていました。 unsigned char x = x; [...] xは、独自の(不定)値で初期化されます。 これは実際にC ++ 20で明確に定義された動作を持っていますか? 一般に、フォームの自己初期化は、初期化が完了する前のの値が不定であるT x = x;ため、未定義の動作をします。不確定な値を評価すると、通常、未定義の動作([basic.indent] / 2)が発生しますが、[basic.indent] /2.3には、不確定な値を持つ左辺値から変数を直接初期化できる特定の例外があります(不確定な値で初期化が発生します) )。xunsigned charunsigned char これだけでは、したがって、未定義の動作を引き起こすが、他のタイプの場合としないT符号なしの狭い文字タイプかそうでないstd::byte、例えばint x = x;。C ++ 17以前にも適用されたこれらの考慮事項は、下部にあるリンクされた質問も参照してください。 ただし、でもunsigned char x = x;、現在のドラフトの[basic.lifetime] / 7は次のように述べています。 同様に、オブジェクトの存続期間が始まる前に[...]その値に依存しないglvalueのプロパティを使用することは明確に定義されています。次の場合、プログラムは未定義の動作をします。 glvalueは、オブジェクトにアクセスするために使用されます。 [...] これはx、例のの値がその存続期間中にのみ使用できることを意味するようです。 [basic.lifetime] / 1は言う: [...] タイプTのオブジェクトの存続期間は、次の場合に始まります。 [...]と 初期化(存在する場合)が完了している(空の初期化を含む)([dcl.init])、 [...] …

6
C ++のオーバーロードされたコンストラクターによる不明な型の変数の初期化
主にpythonのバックグラウンドから来ているので、C ++で型を操作するのに多少苦労しました。 異なる型をパラメーターとして受け取るいくつかのオーバーロードされたコンストラクターの1つを介してクラス変数を初期化しようとしています。autoキーワードの使用は変数の自動宣言に使用できることを読みましたが、私の場合、コンストラクターが選択されるまで初期化されません。しかし、コンパイラーは初期化しないことに満足していませんvalue。 class Token { public: auto value; Token(int ivalue) { value = ivalue; } Token(float fvalue) { value = fvalue; } Token(std::string svalue) { value = svalue; } void printValue() { std::cout &lt;&lt; "The token value is: " &lt;&lt; value &lt;&lt; std::endl; } }; Pythonでは、次のようになります。 class Token(): def …

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