問題タブ [move-constructor]

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.

0 投票する
1 に答える
5783 参照

c++ - C++0x ムーブ コンストラクターの落とし穴

編集:この同じ質問を (この質問で指摘された問題を修正した後) ここで再質問しました:なぜこの C++0x プログラムが予期しない出力を生成するのですか?

基本的な考え方は、注意しないと、動くものを指すと奇妙な結果になる可能性があるということです。


C++ のムーブ コンストラクターとムーブ代入演算子は、非常にポジティブなもののように思えます。また、複製リソースを指す必要がないため、コピー コンストラクターが意味をなさない状況でも使用できます。

しかし、気をつけないと噛まれてしまうこともあります。これは、コンパイラーが移動コンストラクターのデフォルトの実装を生成できるようにする提案を見てきたため、特に関連性があります。誰かが私にそれを与えることができれば、私はそのようなリンクを提供します。

そのため、完全には明らかではないかもしれないいくつかの欠陥があるコードを次に示します。-std=gnuc++0xコードをテストして、フラグを使用して g++ でコンパイルできることを確認しました。それらの欠陥は何ですか。また、どのように修正しますか?

0 投票する
4 に答える
554 参照

c++ - このC++0xプログラムが予期しない出力を生成するのはなぜですか?

このプログラム:

test_header.hpp

test_body.cpp

そして、私はこの出力を取得します:

ちょっと混乱しています。レコーダーを追加すると、古いセンサーがすべて忘れられているようです。

0 投票する
1 に答える
1422 参照

c++ - コンストラクターと代入演算子を移動: 派生クラスのデフォルトがないのはなぜですか?

派生クラス用に作成されていないデフォルトの移動コンストラクタまたは代入演算子があるのはなぜですか? 私が何を意味するかを示すために。このセットアップコードを持つ:

次の行のいずれかがスローされます。

ただし、次のいずれも行いません。

念のため、GCC 4.4 でテストしました。

編集: GCC 4.5 での後のテストでは、同じ動作が示されました。

0 投票する
3 に答える
254 参照

c++ - 可能であれば、挿入されたコンテナ要素を移動する

コンテナー ライブラリで次の最適化を達成しようとしています。

  • 左辺値参照要素を挿入するときは、それを内部ストレージにコピーします。
  • ただし、右辺値参照要素を挿入するときは、サポートされている場合は移動します。

最適化は、たとえば、含まれる要素の型が のような場合に役立つはずですstd::vector。可能であれば移動すると、大幅な速度向上が得られます。

ただし、これまでのところ、このための作業スキームを考案することはできませんでした。私のコンテナーは非常に複雑なので、insert()コードを何度も複製することはできません。サイズが大きいためです。私はすべての「実際の」コードをいくつかの内部ヘルパーに保持したいと考えていますdo_insert()(テンプレート化されている可能性があります) insert()

これに対する私の最善の策のコード(もちろん、実際には何もしないプロトタイプ):

ただし、これは少なくとも GCC 4.4 および 4.5 では機能しません。stderr に「moving」と表示されることはありません。それとも、私が達成したいことは不可能であり、それがemplace()そもそものような機能が存在する理由ですか?

0 投票する
6 に答える
1522 参照

c++ - コンストラクター/オペレーターを移動=

私はC++の新機能、つまりmoveコンストラクターと代入について学習しようとしていますが、興味深い例X::operator=(X&&)を見つけまし たが、私がまったく理解していない唯一のことは、move ctorと代入演算子(以下のコードでマークされています)の1行です。

だから私の質問は:lenght_の値をゼロに設定する必要がありますか、それともそのままにしておくことができますか?メモリリークが発生することはなく、1つの表現でafaicsが少なくなります。

0 投票する
3 に答える
568 参照

c++ - 動くctorと動くdtor

Move constructor/operator=で尋ねたように、しばらくして、その質問に対する正しい答えに同意し、受け入れました。ちょうど考えていたのですが、移動時に呼び出される「移動デストラクタ」のようなものがあると便利でしょうか? move ctorまたはoperator =を使用するたびにオブジェクト。
このようにして、move dtor でのみ指定する必要があり、move コンストラクターによって使用された後にオブジェクトを無効にする方法を指定する必要があります。このセマンティクスがないと、 move ctor または operator= を記述するたびに、移動したオブジェクトを無効にする方法を明示的に記述する必要があります (コードの繰り返し/エラーの紹介)。この件に関するご意見をお待ちしております。

0 投票する
1 に答える
598 参照

c++ - 移動コンストラクターのみを提供するのは悪い形式ですか?

関数から型のコピー不可能なオブジェクトを返したいFooです。これは基本的に、呼び出し元が一連のアクションを実行するために使用するヘルパー オブジェクトであり、アクションの完了後にデストラクタを使用してクリーンアップを実行します。

右辺値参照が出現する前は、 ashared_ptr<Foo>または同様のものを返していました。右辺値参照では、コンストラクターとコピー コンストラクターをプライベートにし、唯一のパブリック コンストラクターをムーブ コンストラクターにするという別のオプションがあります。Foo次のようになります。

私の質問は、これを行うのが悪い形なのか、それとも合理的に見えるのかということです。これが問題を引き起こしたり、読みにくくなったりする理由は考えられませんが、右辺値参照に関してはまだ初心者なので、考えていない考慮事項があるかもしれません。

0 投票する
1 に答える
691 参照

rvalue-reference - 暗黙的な変換でコンストラクター (右辺値参照) を移動する

C++ プロジェクトを MSVC 2008 から 2010 にアップグレードしていますが、新しい CComBSTR 移動コ​​ンストラクター [CComBSTR( CComBSTR&& )] が原因で、あいまいな呼び出しが原因でコンパイラ エラーが発生します。

基本的に、CComBSTR へのキャスト演算子を持つ std::wstring に非常によく似た String クラスがあります。これは、次のコードに似ています。

ここで、コードのいくつかの場所で、次のことを行います。

VS2008 では、CString オブジェクトが暗黙的に CComBSTR 右辺値に変換され、CComBSTR のコピー コンストラクター (const CComBSTR& を取る) が呼び出されて objectName を構築するため、これは機能します。

ただし、C++0x を使用する VS2010 では、CComBSTR 右辺値がコピー コンストラクターと移動コンストラクターの両方に適合するように見えるため、コンパイラはあいまいな呼び出しエラーを返します。

少し不器用ですが、この問題に対する私の解決策は、GetName への呼び出しを static_cast することです。

どちらの行もエラーなしでコンパイルされますが、これが違法か、悪い習慣か、未定義かについてアドバイスが必要です。ありがとうございました。

0 投票する
3 に答える
1309 参照

c++ - スレッドのベクトルに move を使用するカスタム アロケーター

私は現在、C++ での同時実行性について学んでおり、C++0x で可能になると信じているスレッドのベクトルを使用することに出会いました。ただし、現在のコンパイラにはムーブ対応コンテナーが実装されていないようで、 が削除されているためにエラーが生成std::thread::thread(const std::thread&)されます。つまり、ムーブ コンストラクター/ムーブ割り当てはstd::thread.

を使用してカスタムアロケーターを作成することで、この問題を回避できると考えているのは正しいですか

それよりも

? または、このテーマの他のバリエーション (おそらく MyAllocator::construct のオーバーロードを使用)。

注意: これは主に、短期間の教育的な演習であり、コンテナ内のスレッドをいじるのに十分な作業を実行することを目的としています。MyAllocatorこのコンテキストでのみ使用します。ただし、これが実装されている可能性のあるライブラリを教えてください。ソースを突き詰めることができます。

0 投票する
2 に答える
15311 参照

c++ - std::pair または std::tuple で移動セマンティクスを使用する

移動セマンティクスを利用したいが、可動クラスの 1 つが の一部である必要があるとしますstd::pairstd::pair目的は、右辺値として扱うことができ、一緒に転送できるを返す関数を作成することです。

std::pairしかし、移動セマンティクスを認識させるために、それ自体に内部的な変更が加えられない限り、これがどのように行われるのかわかりません。

次のコードを検討してください。

問題はstd::make_pair、コンストラクタ自体と同様に、std::pair2 つのオブジェクトを取り、それらの内部コピーを作成しようとすることです。これにより、コピー コンストラクターの呼び出しが試行されます。しかし、私の例では、新しいペアをに移動resし、コピーが作成されないようにしたいと考えています。std::pair内部で次のコンストラクターが定義されていない限り、これは不可能だと思います。

しかし、少なくとも私が使用しているコンパイラ(gcc 4.3.2)ではそうではありません。私のコンパイラが単に古くなっている可能性があり、実際には新しいバージョンにはこのムーブ対応コンストラクタがあります。しかし、現時点では移動のセマンティクスに関する私の理解はやや不安定なので、ここで何かを見落としているだけなのかどうかはわかりません。それで、実際に再実装せずに、私が達成しようとしていることは可能std::pairですか? または、コンパイラが古くなっていますか?