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

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

3
shared_ptrのdeleterは、カスタムアロケーターによって割り当てられたメモリに格納されていますか?
私が持っていると言うshared_ptrカスタムアロケータでとカスタム削除手段。 削除プログラムを保存する場所について話している標準では何も見つかりません。カスタムアロケータが削除プログラムのメモリに使用されることはなく、そうでないこともありません。 これは指定されていませんか、それとも何か不足していますか?

2
PODタイプであることは、単純な標準レイアウトタイプであることとまったく同じですか?
C ++ 20では、PODの概念は推奨されません。これは、それがささいで標準的なレイアウトであるという意味のない複合特性であるためと考えられます。ただし、C ++ 20ドラフトでのPODの定義は、厳密には「単純なものと標準的なレイアウトの両方」ではありません。実際には: PODクラスは、自明なクラスと標準レイアウトクラスの両方であり、非PODクラス(またはその配列)タイプの非静的データメンバーを持たないクラスです。PODタイプは、スカラータイプ、PODクラス、そのようなタイプの配列、またはこれらのタイプのいずれかのcv修飾バージョンです。 言い換えれば、PODタイプは単純で標準的なレイアウトであるだけでなく、再帰的にもそうです。 この再帰的な要件は冗長ですか?言い換えれば、型が自明で標準的なレイアウトでもある場合、それは自動的に再帰的に自明で標準的なレイアウトでもありますか?答えが「いいえ」の場合、PODに失敗した標準レイアウトの自明なタイプの例は何ですか?

2
実際に実際に使用する必要がある<random>の乱数エンジンはどれですか?std :: mt19937?
C ++ &lt;random&gt;機能を実用的なプログラムで使用するとします(「実用的」の定義については、ここでの制約はこの質問の一部です)。おおよそ次のようなコードがあります。 int main(int argc, char **argv) { int seed = get_user_provided_seed_value(argc, argv); if (seed == 0) seed = std::random_device()(); ENGINE g(seed); // TODO: proper seeding? go_on_and_use(g); } 私の質問は、あなたはどのタイプを使うべきですENGINEか? 私はいつもstd::mt19937タイプするのが速くて名前認識があったのでいつも言っていました。しかし最近では、みんなが言っているように、メルセンヌツイスターは非常にヘビー級でキャッシュに不向きで、他の人が行うすべての統計的検定にさえ合格していません。 std::default_random_engineそれは明らかな「デフォルト」なので言いたいのですが。しかし、それはプラットフォームによって異なりあれば、私にはわからない、とそれは統計的にどんな良いことだかどうかはわかりません。 最近は誰もが64ビットプラットフォームを使用std::mt19937_64しているので、少なくともover を使用する必要がありstd::mt19937ますか? 私が言いたいpcg64かxoroshiro128、彼らは尊敬と軽量に見えるので、彼らは内に存在しない&lt;random&gt;すべてで。 私は約何も知らないminstd_rand、minstd_rand0、ranlux24、knuth_b確かに彼らは何のために良いことがあります- 、など? 明らかに、ここにはいくつかの競合する制約があります。 エンジンの強さ。(&lt;random&gt;暗号的に強力なPRNGはありませんが、一部の標準化されたものは他のものよりも「弱い」ですよね?) sizeof そのエンジン。 その速度operator()。 播種のしやすさ。mt19937初期化する状態が非常に多いため、適切にシードするのが難しいことで有名です。 ライブラリベンダー間の移植性。あるベンダーfoo_engineが別のベンダーとは異なる数値を生成する場合foo_engine、それは一部のアプリケーションには適していません。(うまくいけば、これは多分それ以外を除外しませんdefault_random_engine。) これらすべての制約をできる限り考慮して、究極の「標準ライブラリ内にとどまるベストプラクティス」の答えは何でしょうか。を使い続けるべきstd::mt19937ですか、それとも何ですか?
21 c++  c++11  random 


4
戻り時に暗黙的な変換は許可されていません
#include &lt;optional&gt; bool f() { std::optional&lt;int&gt; opt; return opt; } コンパイルしません: 'return': cannot convert from 'std::optional&lt;int&gt;' to 'bool' 参考資料を参考にして説明を探したのですが、大丈夫なので読んでみました。 暗黙的な変換は、あるタイプT1の式がそのタイプを受け入れないが他のタイプT2を受け入れるコンテキストで使用される場合は常に実行されます。特に: T2をパラメーターとして宣言された関数を呼び出すときに、式が引数として使用される場合。 式がT2を期待する演算子でオペランドとして使用される場合。 T2を返す関数のreturnステートメントを含む、T2型の新しいオブジェクトを初期化するとき; 式がswitchステートメントで使用されている場合(T2は整数型)。 式がifステートメントまたはループで使用される場合(T2はブール値)。

4
テンプレート型の正しいコンストラクターを呼び出す方法は?
次のコードでは、コメント行をそのすぐ上の行と同じように機能させるにはどうすればよいですか? テンプレートの適切なコンストラクターを呼び出す汎用コードにしたいと思いTypeます。 #include &lt;string&gt; #include &lt;iostream&gt; template &lt;typename Type&gt; struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class&lt;std::string&gt; a = std::string("abc"); // Class&lt;std::string&gt; b = "abc"; std::cout &lt;&lt; a.data &lt;&lt; std::endl; return 0; }

5
c ++での設定操作(既存の値を更新)
これが私のコードです: while (it!=s.end()) //here 's' is a set of stl and 'it' is iterator of set { *it=*it-sub; //'sub' is an int value it++; } イテレータでセットの値を更新できません。セットのすべての要素から整数値「sub」を減算したいのですが。 実際の問題がどこにあるのか、実際の解決策は何ですか? エラーメッセージは次のとおりです。 error: assignment of read-only location ‘it.std::_Rb_tree_const_iterator&lt;int&gt;::operator*()’ 28 | *it=*it-sub; | ~~~^~~~~~~~
21 c++ 

1
なぜGCCは配列の初期化を集約して、最初にゼロ以外の要素を含めて全体をゼロで埋めるのですか?
なぜgccは残りの96個の整数だけではなく、配列全体をゼロで埋めるのですか?ゼロ以外の初期化子はすべて配列の先頭にあります。 void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1とgcc9.2はどちらもこのようにasmを作成します(Godboltコンパイラエクスプローラー)。 # gcc9.2 -O3 -m32 -mno-sse bar(): push edi # save call-preserved EDI which …


1
関数の引数としての{}が曖昧にならないのはなぜですか?
このコードを考えてみましょう: #include &lt;vector&gt; #include &lt;iostream&gt; enum class A { X, Y }; struct Test { Test(const std::vector&lt;double&gt;&amp;, const std::vector&lt;int&gt;&amp; = {}, A = A::X) { std::cout &lt;&lt; "vector overload" &lt;&lt; std::endl; } Test(const std::vector&lt;double&gt;&amp;, int, A = A::X) { std::cout &lt;&lt; "int overload" &lt;&lt; std::endl; } }; int main() { …

3
指定されたstd :: variant型を指定された基準で分割します
特定のバリアントタイプによる方法 using V = std::variant&lt;bool, char, std::string, int, float, double, std::vector&lt;int&gt;&gt;; 2つのバリアント型を宣言する using V1 = std::variant&lt;bool, char, int, float, double&gt;; using V2 = std::variant&lt;std::string, std::vector&lt;int&gt;&gt;; どこV1からすべての算術型を含んVとV2から、すべての非算術型が含まれてV? V テンプレートクラスのパラメータにすることができます。次に例を示します。 template &lt;class V&gt; struct TheAnswer { using V1 = ?; using V2 = ?; }; 一般に、基準は次のようなconstexpr変数にすることができます。 template &lt;class T&gt; constexpr bool filter;
20 c++  c++17  std-variant 

1
スレッドの生成はそれ自体でメモリ順序の保証を提供しますか?
私はこれを大まかにしたいです: 初期スレッド: 一部の値をグローバル変数に書き込みます(それらは二度と書き込まれません) これは、適度に大きなデータ(配列、文字列など)になる可能性があります。簡単には作れませんstd::atomic&lt;&gt;。 他のスレッドを生成する その他のスレッド: グローバル状態を読み取る 仕事などをする これで、引数をstd::threadに渡すことができることがわかりましたが、この例を通してC ++のメモリ保証を理解しようとしています。 また、実際の実装では、スレッドを作成するとメモリバリアが発生し、その時点までに親スレッドが書き込んだすべてをスレッドが「確認」できることを確信しています。 しかし私の質問は、これは規格によって保証されていますか? 余談:ダミーstd::atomic&lt;int&gt;などを追加して、他のスレッドを開始する前にそこに書き込んでから、他のスレッドで起動時に一度読み取ることができると思います。発生前のすべてのメカニズムにより、以前に作成されたグローバルな状態が適切に表示されることが保証されます。 しかし、私の質問は、そのようなものが技術的に必要かどうか、またはスレッドの作成で十分かどうかです。

1
テンプレートの自動戻りタイプとあいまいさ
オーバーロードされたテンプレート関数があります: template&lt;typename T1, typename T2&gt; auto overMax(T1 a, T2 b) { std::cout &lt;&lt; __FUNCSIG__ &lt;&lt; std::endl; return b &lt; a ? a : b; } template&lt;typename RT, typename T1, typename T2&gt; RT overMax(T1 a, T2 b) { std::cout &lt;&lt; __FUNCSIG__ &lt;&lt; std::endl; return b &lt; a ? a : b; …

4
std :: back_inserterでstd :: transformを使用することは有効ですか?
Cppreferenceには、次のサンプルコードがありstd::transformます。 std::vector&lt;std::size_t&gt; ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -&gt; std::size_t { return c; }); しかし、それはまた言います: std::transformunary_opまたはの順序どおりの適用は保証されませんbinary_op。関数をシーケンスに順番に適用したり、シーケンスの要素を変更する関数を適用したりするには、を使用しますstd::for_each。 これはおそらく並列実装を可能にするためです。しかし、の3番目のパラメータは、std::transformあるLegacyOutputIteratorため、次の事後条件を有しています++r。 この操作の後rは、増分可能である必要はなく、以前の値のコピーは、r逆参照可能または増分可能である必要がなくなります。 したがって、出力の割り当ては順番に行わなければならないように思えます。それらは単に、アプリケーションunary_opが故障し、一時的な場所に保存されているが、出力に順番にコピーされる可能性があることを意味していますか?それはあなたがしたいことのようには聞こえません。 ほとんどのC ++ライブラリは、実際には並列実行プログラムをまだ実装していませんが、Microsoftは実装しています。私はかなり確信している、これは関連するコードである、と私は考えてそれが呼び出すこのpopulate()機能をするので確実に行うために有効なものではありません出力、のチャンクにレコードイテレータに LegacyOutputIteratorそれのコピーをインクリメントすることによって無効にすることができます。 何が欠けていますか?

2
簡単なオブジェクトの場合、 `this`で新しい配置を呼び出しても安全ですか?
この質問はすでに何度か尋ねられたことは知っていますが、この特定のケースに対する答えは見つかりませんでした。 リソースを所有しておらず、空のデストラクタとデフォルトのコンストラクタを持つ簡単なクラスがあるとします。クラス内で初期化されるメンバー変数がいくつかあります。それらの1つはありませんconst。 そのようなクラスのオブジェクトを再初期化し、deInit手動でメソッドを記述せずにそれをしたいと思います。このようにしても安全ですか? void A::deInit() { new (this)A{}; } 問題はありません。オブジェクトは常に有効な状態でありthis、同じアドレスを指しています。C ++なので、確認したい。

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