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

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

4
デフォルトのmove-assignment / move-constructorがないのはなぜですか?
私は単純なプログラマーです。私のクラスメンバーの変数は、ほとんどの場合、PODタイプとSTLコンテナーで構成されています。このため、代入演算子やコピーコンストラクタを記述する必要はほとんどありません。これらはデフォルトで実装されているからです。 これに加えて、std::move移動できないオブジェクトで使用する場合は、代入演算子を使用するため、std::move完全に安全です。 私は単純なプログラマーなので、コンパイラーが " this->member1_ = std::move(other.member1_);..." として実装するだけなので、作成するすべてのクラスに移動コンストラクター/割り当て演算子を追加せずに、移動機能を利用したいと思います。 しかし、そうではありません(少なくともVisual 2010ではそうではありません)。これには特別な理由がありますか? さらに重要なことには; これを回避する方法はありますか? 更新: GManNickGの答えを見ると、GManNickGはこのための優れたマクロを提供しています。また、知らない場合は、移動セマンティクスを実装すれば、メンバーのスワップ関数を削除できます。

3
これはC ++ 11 forループの既知の落とし穴ですか?
いくつかのメンバー関数で3つのdoubleを保持するための構造体があるとします。 struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; これは簡単にするために少し工夫されていますが、同様のコードがそこにあることに同意するはずです。これらのメソッドを使用すると、便利なチェーンを作成できます。次に例を示します。 Vector v …

3
staticキーワードの廃止…これ以上?
C ++ではstatic、変換ユニット内でキーワードを使用して、シンボル(変数または関数宣言)の可視性に影響を与えることができます。 n3092では、これは非推奨になりました。 付録D.2 [depr.static] 名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は非推奨になりました(3.3.6を参照)。 n3225では、これは削除されました。 私は見つけることができる唯一の記事は、やや非公式です。 ただし、Cとの互換性(およびCプログラムをC ++としてコンパイルする機能)のために、非推奨は煩わしいことを強調しています。ただし、CプログラムをC ++として直接コンパイルすることは、すでに苛立たしい経験になる可能性があるため、検討する必要があるかどうかはわかりません。 なぜ変更されたのか誰か知っていますか?
89 c++  static  c++11  standards 

3
const voidとは何ですか?
の説明はstd::is_void次のように述べています。 Tがタイプvoid、const void、volatile void、またはconst volatile voidの場合、trueに等しいメンバー定数値を提供します。 それでは、、const voidまたはvolatile void? この回答は、const void戻り値の型が無効になることを示しています(ただし、VC ++ 2015でコンパイルされます) const void foo() { } 標準でconst void無効な場合(VCが間違っている)-それでは何const voidですか?
89 c++  c++11  c++14 

4
可変個引数テンプレートの引数を保存する方法は?
後で使用するためにパラメータパックを何らかの方法で保存することは可能ですか? template <typename... T> class Action { private: std::function<void(T...)> f; T... args; // <--- something like this public: Action(std::function<void(T...)> f, T... args) : f(f), args(args) {} void act(){ f(args); // <--- such that this will be possible } } その後、: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, …

8
vector <struct>のC ++ 11 emplace_back?
次のプログラムを検討してください。 #include &lt;string&gt; #include &lt;vector&gt; using namespace std; struct T { int a; double b; string c; }; vector&lt;T&gt; V; int main() { V.emplace_back(42, 3.14, "foo"); } それは機能しません: $ g++ -std=gnu++11 ./test.cpp In file included from /usr/include/c++/4.7/x86_64-linux-gnu/bits/c++allocator.h:34:0, from /usr/include/c++/4.7/bits/allocator.h:48, from /usr/include/c++/4.7/string:43, from ./test.cpp:1: /usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Up*, _Args&amp;&amp; …
89 c++  c++11 


3
プライベートコンストラクターがプライベートコンストラクターではないのはいつですか?
タイプがあり、そのデフォルトのコンストラクタをプライベートにしたいとします。私は次のように書きます: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

6
ラムダ式を返す関数
C ++ 11でラムダ関数を返す関数を書くことは可能だろうか。もちろん、1つの問題は、そのような関数をどのように宣言するかです。各ラムダには型がありますが、その型はC ++では表現できません。私はこれがうまくいくとは思いません: auto retFun() -&gt; decltype ([](int x) -&gt; int) { return [](int x) { return x; } } これも: int(int) retFun(); ラムダから関数へのポインターなどへの自動変換については知りません。関数オブジェクトを手作りして返す唯一の解決策はありますか?
88 c++  function  c++11  lambda 

6
C ++ 11で(同じタイプの)ラムダのベクトルを作成できないのはなぜですか?
ラムダのベクトルを作成しようとしましたが、失敗しました。 auto ignore = [&amp;]() { return 10; }; //1 std::vector&lt;decltype(ignore)&gt; v; //2 v.push_back([&amp;]() { return 100; }); //3 2行目までは、正常にコンパイルされます。しかし、3行目はコンパイルエラーを出します: エラー: 'std :: vector &lt;main():: &lt;lambda()&gt;&gt; :: push_back(main():: &lt;lambda()&gt;)'の呼び出しに一致する関数がありません 関数ポインタのベクトルや関数オブジェクトのベクトルは必要ありません。ただし、実際のラムダ式をカプセル化する関数オブジェクトのベクトルは、私にとっては機能します。これは可能ですか?
88 c++  vector  lambda  c++11 

3
デフォルト、値、ゼロの初期化の混乱
値とデフォルトとゼロの初期化について非常に混乱しています。特に、異なる標準C ++ 03とC ++ 11(およびC ++ 14)を採用する場合。 私はここで本当に良い答えを引用して拡張しようとしています値-/デフォルト-/ゼロ-初期化C ++ 98とC ++ 03誰かが記入するのを手伝ってくれるなら多くのユーザーを助けるので、それをより一般的にしますいつ何が起こるかについての概要を把握するためにギャップが必要でしたか? 一言で言えば例による完全な洞察: new演算子によって返されるメモリが初期化される場合もあれば、新しい型がPOD(単純な古いデータ)であるかどうか、またはPODメンバーを含み、を使用しているクラスであるかどうかに依存しない場合もあります。コンパイラーが生成したデフォルトのコンストラクター。 ではC ++ 1998:初期化の2種類があるゼロとデフォルトの初期化は、 C ++ 2003の初期化の3種類、値初期化を加えました。 C ++ 2011 / C ++ 2014のみリストの初期化は、添加し、そしてための規則値- / default- /ゼロ初期化は、ビットを変更しました。 仮定: struct A { int m; }; struct B { ~B(); int m; }; struct C { C() : m(){}; …
88 c++  c++11  c++14  c++03  c++98 

5
std :: shared_ptrに相当する非アトミックなものはありますか?そして、なぜ<memory>にないのですか?
これは、次の原子性に関する2つの部分からなる質問ですstd::shared_ptr。 1. 私が知る限り、それはアトミックstd::shared_ptrな唯一のスマートポインター&lt;memory&gt;です。std::shared_ptr利用可能な非アトミックバージョンがあるかどうか疑問に思っています(何も表示されない&lt;memory&gt;ので、Boostのような標準外の提案も受け付けています)。boost::shared_ptrアトミックでもあることは知っていますが(BOOST_SP_DISABLE_THREADS定義されていない場合)、別の選択肢があるのでしょうか?と同じセマンティクスを持つstd::shared_ptrが、原子性がないものを探しています。 2.なぜstd::shared_ptrアトミックなのか理解しています。ちょっといいです。ただし、すべての状況に適しているわけではなく、C ++には、歴史的に「使用した分だけ支払う」というマントラがありました。複数のスレッドを使用していない場合、または複数のスレッドを使用しているがスレッド間でポインターの所有権を共有していない場合、アトミックスマートポインターはやり過ぎです。私の2番目の質問は、なぜ非アトミックバージョンのstd::shared_ptrがC ++ 11で提供されなかったのかということです。(理由があると仮定して)(答えが単に「非アトミックバージョンは単に考慮されなかった」または「誰も非アトミックバージョンを要求したことがない」である場合は問題ありません!) 質問#2で、誰かがshared_ptr(Boostまたは標準化委員会のいずれかに)の非アトミックバージョンを提案したことがあるかどうか疑問に思っています(のアトミックバージョンを置き換えるのでshared_ptrはなく、それと共存するために)そしてそれは特定の理由。

5
共有ポインタを引数として渡す
共有ポインタでラップされたオブジェクトを宣言すると、次のようになります。 std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); それから私はそれをメソッドへの引数として渡したいと思いました: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上記は単にshared_ptの参照カウントをインクリメントするだけで、すべてがクールですか?それとも、ダングリングポインタを残しますか? あなたはまだこれをすることになっていますか?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } (スマートポインタ全体ではなく)1つのアドレスをコピーするだけでよいため、2番目の方法の方が効率的かもしれないと思いますが、1番目の方法の方が読みやすく、パフォーマンスの制限を押し上げることはないと思います。危険なものがないことを確認したいだけです。 ありがとうございました。

5
C ++ 11のstd :: atomic :: compare_exchange_weak()を理解する
bool compare_exchange_weak (T&amp; expected, T val, ..); compare_exchange_weak()C ++ 11で提供される比較交換プリミティブの1つです。それはだ、弱いオブジェクトの値が等しい場合、それは偽さえを返すという意味でexpected。これは、(x86のように1つではなく)一連の命令を使用して実装する一部のプラットフォームでの誤った障害が原因です。このようなプラットフォームでは、コンテキストスイッチ、別のスレッドによる同じアドレス(またはキャッシュライン)のリロードなどにより、プリミティブが失敗する可能性があります。それはだspurious、それが(等しくないオブジェクトの値ではありませんようexpected、操作を失敗しました)。代わりに、それは一種のタイミングの問題です。 しかし、私を困惑させるのは、C ++ 11標準(ISO / IEC 14882)で言われていることです。 29.6.5 ..疑似障害の結果、弱いコンペアアンドスワップのほぼすべての使用がループになります。 ほぼすべての用途でループする必要があるのはなぜですか?それは、誤った失敗のために失敗したときにループすることを意味しますか?もしそうなら、なぜcompare_exchange_weak()私たちは自分たちでループを使用して書くのですか?私たちはcompare_exchange_strong()、私たちのために偽の失敗を取り除くべきだと私が思うものを使うことができます。の一般的な使用例はcompare_exchange_weak()何ですか? 関連する別の質問。彼の著書「C ++ Concurrency In Action」の中で、Anthonyは次のように述べています。 //Because compare_exchange_weak() can fail spuriously, it must typically //be used in a loop: bool expected=false; extern atomic&lt;bool&gt; b; // set somewhere else while(!b.compare_exchange_weak(expected,true) &amp;&amp; !expected); //In …

5
LinuxのGCCでstd :: threadを使用するための正しいリンクオプションは何ですか?
こんにちは私はstd::threadG ++で使用しようとしています。これが私のテストコードです #include &lt;thread&gt; #include &lt;iostream&gt; int main(int, char **){ std::thread tt([](){ std::cout&lt;&lt;"Thread!"&lt;&lt;std::endl; }); tt.join(); } コンパイルされますが、実行しようとすると次のようになります。 terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted 私のコンパイラバージョン: $ g++ --version g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see …

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