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

このタグは、C ++ 11としてコンパイルする必要があるコードに使用します(C ++ 14以降で導入された機能は使用しません)。

6
std :: vector :: swapメソッドを使用して、C ++で2つの異なるベクトルを交換しても安全ですか?
次のコードがあるとします。 #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } ベクトルがでなくstd::string、クラスであると想像してください。 std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; 2つのベクトルをstd::vector::swapメソッドで交換しても安全WidgetVector.swap(Widget2Vector);ですか?それともUBにつながりますか?
30 c++  c++11  vector  stdvector  swap 

3
C ++が2番目のテンプレート引数を推測しないようにするにはどうすればよいですか?
私はC ++ライブラリ(strf)を使用していますが、その中には、次のコードが含まれています。 namespace strf { template <typename ForwardIt> inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template <typename Range, typename CharT> inline auto range(const Range& range, const CharT* sep) { /* ... */ } } 今、strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)私のコードで使用したいと思います。しかし、そのようにすると、次のエラーが発生します(CUDA 10.1のNVCCを使用)。 error: more than one instance of …


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

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
テンプレート型の正しいコンストラクターを呼び出す方法は?
次のコードでは、コメント行をそのすぐ上の行と同じように機能させるにはどうすればよいですか? テンプレートの適切なコンストラクターを呼び出す汎用コードにしたいと思い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; }

4
連続列挙型C ++ 11
列挙型が連続しているかどうかをC ++ 11でチェックする方法はありますか? ない列挙値を与えることは完全に有効です。C ++ 14、C ++ 17、またはC ++ 20の型特性のような機能があるのでしょうか?これはstatic_assertで使用されます。 次に小さな例を示します。 enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST&lt;Types_Discontinuous&gt;::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST&lt;Types_Continuous&gt;::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

2
これは古いC ++スタイルのコンストラクタですか?
ここにC ++コードの一部があります。 この例では、多くのコードブロックがコンストラクター呼び出しのように見えます。残念ながら、ブロックコード#3はそうではありません(https://godbolt.org/z/q3rsxnとhttps://cppinsights.ioを使用して確認できます)。 これは古いC ++表記であり、{}を使用した新しいC ++ 11構成表記の導入を説明できると思います(#4を参照)。 T(i)意味の説明はありますか?コンストラクタの表記にとても近いですが、間違いなくとても違いますか? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T named t using int ctor } { // #2 T t = T(i); // new T …
17 c++  c++11 

3
可変個のテンプレート:グループで引数を展開
2つの引数を取る関数があります。 template &lt;typename T1, typename T2&gt; void foo(T1 arg1, T2 arg2) { std::cout &lt;&lt; arg1 &lt;&lt; " + " &lt;&lt; arg2 &lt;&lt; '\n'; } そして、その引数をペアで転送するべき可変部分: template &lt;typename... Args&gt; void bar(Args&amp;&amp;... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward&lt;Args&gt;(args), std::forward&lt;Args&gt;(args) ), ... ); // ^ Sends each argument twice, …

2
C ++ 20の前にstd :: swapがconstexprとマークされていないのはなぜですか?
C ++ 20ではstd::swap、constexpr関数になります。 標準ライブラリは、マーキングの点constexprで言語に遅れを取っていることを知っていますが、2017年まで&lt;algorithm&gt;に、他の多くのものと同様にconstexprになりました。まだ-ありstd::swapませんでした。そのマーキングを妨げる奇妙な言語の欠陥があったことを漠然と覚えていますが、詳細を忘れています。 誰かがこれを簡潔かつ明確に説明できますか? 動機:C ++ 11 / C ++ 14コードで-のstd::swap()ような関数をマークすることがなぜ悪い考えであるのかを理解する必要がありconstexprます。

3
2つの範囲内でベクトルを降順に並べ替える
整数のベクトルがあるとしましょう: std::vector&lt;int&gt; indices; for (int i=0; i&lt;15; i++) indices.push_back(i); 次に、降順に並べ替えます。 sort(indices.begin(), indices.end(), [](int first, int second) -&gt; bool{return indices[first] &gt; indices[second];}) for (int i=0; i&lt;15; i++) printf("%i\n", indices[i]); これにより、以下が生成されます。 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ここで、数字3、4、5、6を最後に移動し、それらの降順を維持したいとします(できればsort2回目に使用する必要はありません)。つまり、ここに私が欲しいものがあります: 14 13 12 11 10 …

1
要素を完全に転送してstd :: vectorをリスト初期化できますか?
std :: vectorの集約 リストの初期化は、移動がより適切な場合にコピーの初期化を実行することに気付きました。同時に、複数のemplace_backsが必要な処理を実行します。 テンプレート関数を書くというこの不完全な解決策しか思いつかなかったinit_emplace_vector。ただし、明示的ではない単一値コンストラクターにのみ最適です。 template &lt;typename T, typename... Args&gt; std::vector&lt;T&gt; init_emplace_vector(Args&amp;&amp;... args) { std::vector&lt;T&gt; vec; vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika (vec.emplace_back(std::forward&lt;Args&gt;(args)), ...); // C++17 return vec; } 質問 std :: vectorをできるだけ効率的に初期化するために、本当にemplace_backを使用する必要がありますか? // an integer passed to large is actually the size of the resource std::vector&lt;large&gt; v_init { …

3
なぜ配列の次元はその型の一部なのですか?
C ++入門書を読んでいるときに、「配列内の要素の数は配列の型の一部です。」という文に出くわしました。だから私は次のコードを使用して調べたいと思いました: #include&lt;iostream&gt; int main() { char Array1[]{'H', 'e', 'l', 'p'}; char Array2[]{'P', 'l', 'e', 'a', 's', 'e'}; std::cout&lt;&lt;typeid(Array1).name()&lt;&lt;std::endl; //prints A4_c std::cout&lt;&lt;typeid(Array2).name()&lt;&lt;std::endl; //prints A6_c return 0; } 興味深いことに、2つの配列のtypeidの結果は、なんらかの違いがあることを示しています。 舞台裏で何が起こっているのですか? 配列のサイズを含む型を持つ必要があるのはなぜですか?サイズを変えてはいけないというだけのことですか? これは配列の比較にどのように影響しますか? コンセプトを深く理解したいだけ。
14 c++  arrays  c++11 

3
関数が定義されているタイプに対してのみ、関数テンプレート内で関数を実行します
入力としてさまざまなタイプを受け取る関数テンプレートがあります。それらのタイプのうち、そのうちの1つだけがgetInt()機能を持っています。したがって、コードでそのタイプに対してのみ関数を実行する必要があります。解決策を提案してください。ありがとう #include &lt;type_traits&gt; #include &lt;typeinfo&gt; class X { public: int getInt(){ return 9; } }; class Y{ }; template&lt;typename T&gt; void f(T&amp; v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same&lt;T, X&gt;::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …

4
cppreferenceでの緩和された順序付けの説明に誤りはありますか?
cppreference.comのドキュメントstd::memory_orderには、緩和された順序付けの例があります。 ゆるやかな注文 タグ付けさmemory_order_relaxedれたアトミック操作は同期操作ではありません。同時メモリアクセスに順序を課すことはありません。原子性と変更順序の一貫性のみが保証されます。 たとえば、xとyが最初はゼロの場合、 // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D は、r1 == r2 == 42を生成することを許可されています。なぜなら、Aはスレッド1内でBの前にシーケンスされ、Cはスレッド2内でDの前にシーケンスされるからです。 xの変更順序でCの前に表示されます。yに対するDの副作用はスレッド1の負荷Aに見え、xに対するBの副作用はスレッド2の負荷Cに見える可能性があります。特に、これはDがCの前に完了する場合に発生する可能性があります。スレッド2、コンパイラの並べ替えまたは実行時のいずれかが原因。 「Cはスレッド2内でDの前にシーケンスされます」と書かれています。 評価順にあるsequenced-beforeの定義によれば、AがBの前にシーケンス化されている場合、Aの評価はBの評価が始まる前に完了します。Cはスレッド2内でDの前に順序付けられているため、Dが始まる前にCを完了する必要があるため、スナップショットの最後の文の条件部分は決して満たされません。

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