問題タブ [move-semantics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ベクトルが大きくなるときに移動セマンティクスを強制する方法は?
std::vector
特定のクラスのオブジェクトがありますA
。クラスは自明ではなく、コピー コンストラクターとムーブ コンストラクターが定義されています。
ベクトルをA
オブジェクトで満たすと (例: を使用myvec.push_back(a)
)、ベクトルのサイズが大きくなり、コピー コンストラクターを使用してA( const A&)
、ベクトル内の要素の新しいコピーをインスタンス化します。
A
クラスのムーブコンストラクターが代わりに使用されていることをどうにかして強制できますか?
c++ - initializer_listおよび移動セマンティクス
要素をから移動することはできstd::initializer_list<T>
ますか?
特別なコンパイラの注意が必要であり、C ++標準ライブラリの通常のコンテナのような値のセマンティクスがないためstd::intializer_list<T>
、申し訳ありませんが、質問するよりも安全です。
c++ - unique_ptr C++03 エミュレーションの move 関数
unique_ptr の C++03 エミュレーションがどのように実装されているかを理解しようとしています。unique_ptr は std::auto_ptr に非常に似ていますが、より安全です。auto_ptr が所有権を暗黙的に (つまり、黙って) 譲渡した場合、コンパイラ エラーを吐き出します。たとえば、単純な割り当て。関数move
は、エミュレートされた unique_ptr の安全性の背後にある鍵です。
質問:
- 移動機能が 3 つあるのはなぜですか?
参照を受け取り、それを右辺値に変換する 3 番目の move 関数は、次のように実装 (簡略化) されています。
/li>
上記のコードでは、T への明示的な変換は不必要に思えます。実際、Visual Studio 2010 は T への明示的な変換がなくても問題ありません。
ただし、g++、clang、Comeau は 2 番目のバージョンが好きではありません。unique_ptr<T>
これらのコンパイラは、パラメーターとして取るコンストラクターがないと文句を言いdetail_unique_ptr::rv<T>
ます。何故ですか?unique_ptr は、パラメーターとして受け取る (非明示的な) コンストラクターを既に定義してdetail_unique_ptr::rv<T>
います。それが自動的に取得されないのはなぜですか?
c++ - 移動専用タイプのベクトルをリストして初期化できますか?
次のコードをGCC4.7スナップショットに渡すと、unique_ptr
sをベクターにコピーしようとします。
明らかに、std::unique_ptr
コピーできないため、これは機能しません。
エラー:削除された関数の使用'std :: unique_ptr <_Tp、_Dp> :: unique_ptr(const std :: unique_ptr <_Tp、_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp、_Dp> = std :: unique_ptr] '
初期化子リストからポインターをコピーしようとするGCCは正しいですか?
c++ - 「* this の右辺値参照」とは何ですか?
clang のC++11 ステータス ページで、「*this の右辺値参照」という提案に出会いました。
私は右辺値参照についてかなり読んで理解しましたが、これについては知らないと思います。また、この用語を使用して Web 上で多くのリソースを見つけることもできませんでした。
ページに提案論文へのリンクがあります: N2439 (*this への移動セマンティクスの拡張)、そこから多くの例を得ることもできません。
この機能は何ですか?
c++ - 移動セマンティクスができたので、特殊なstd :: swapは非推奨になりましたか?
重複の可能性:
移動セマンティクス==カスタムスワップ関数は廃止されましたか?
これはstd::swap
C++11でどのように見えるかです:
もちろん、私のクラスがムーブコンストラクターとムーブ代入演算子を定義している場合、私はまだstd::swap
自分の型に特化する必要がありますか、それともそれが得られるのと同じくらい効率的ですか?std::swap
c++ - 暗黙的に変換可能なオブジェクトを使用してムーブ オーバーロード関数を呼び出すと、コンパイル エラーが発生する
このプログラムは次を使用してコンパイルされませんclang++ test.cpp -std=c++0x
:
コンパイル エラー:
なぜコンパイルされないのですか?A::operator = (A&&)
コンパイラが を優先するのはなぜA::operator = (const A&)
ですか?
さらに、(上記のプログラムの)while とdo notのA a = b;
両方がコンパイルされるのはなぜでしょうか。A a; a = b;
A a(b);
c++ - C ++-Boost.Promise、Boost.Unique_Future、およびMoveSemantics
ここでは、BartoszMilewskiによるいくつかのチュートリアルをフォローしています。これは非常に便利です。ただし、作成者はC ++11スレッド標準のjust ::thread実装(まだ持っていません)を使用しているため、チュートリアルの作成者が簡単に言うように、今のところブーストスレッドを使用することにしました。そうする。これは、シリーズの最初の3つのチュートリアルに当てはまるようですが、4番目のチュートリアルでいくつかの問題にぶつかりました。これが私のコードです:
次の行は、私が理解していない問題を提起しているようです。
コンパイラが文句を言うところ:
エラーC2248:'boost :: promise :: promise':クラス'boost::promise'で宣言されたプライベートメンバーにアクセスできません
誰かが問題が何であるかを提案できますか?
前もって感謝します!
c++ - VS2010バインドの実装は、移動専用タイプをサポートしていませんか?
次のコードはVisualStudio2010ではコンパイルされません(ただし、GCCでは正常に動作します)。
私が得るエラーは次のとおりです。
'std :: unique_ptr <_Ty> :: unique_ptr':クラスで宣言されたプライベートメンバーにアクセスできません' std :: unique_ptr <_Ty> '
VS2010バインドの実装が移動のみの型をサポートしていないためですか?