問題タブ [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.
c++ - コンストラクターと静的配列を移動する
私はC++ でムーブ コンストラクターの可能性を探ってきましたが、以下のような例で、この機能を利用する方法を知りたいと思っていました。次のコードを検討してください。
上記の例で、(MSVC++ 2011 を使用して) プログラムをトレースすると、 のFoo<N>::Foo(Foo<N>&&)
構築時に が呼び出されていることがわかりfoo
ます。これは望ましい動作です。ただし、 がない場合はFoo<N>::Foo(Foo<N>&&)
、Foo<N>::Foo(const Foo<N>&)
代わりに , が呼び出され、冗長なコピー操作が行われます。
私の質問は、コードに記載されているように、静的に割り当てられた単純な配列を使用しているこの特定の例では、移動コンストラクターを使用してこの冗長なコピーを回避する方法はありますか?
c++ - 移動-メンバーstd::vectorを使用したセマンティクス
これが以前に尋ねられた場合は申し訳ありませんが、私が理解しているように、C ++ 11にstd::vector
はmoveコンストラクターがあるため、値ごとに返すなど、特定の状況ではコピーのコストはほとんどかかりません。vector
ただし、メンバー変数としてaを使用して、このようなクラスがある場合は、次のようになります。
そして、これらの1つを値で返す関数があります。
のmoveコンストラクターmc.myvec
が呼び出され、のmoveコンストラクターは、それ自体がmoveコンストラクターについて何も知らなくてもstd::vector
利用されますか?MyClass
または、のコピーコンストラクターvector
が呼び出され、それらの数千(場合によっては数百万)のすべてint
を1つずつコピーする必要がありますか?
c++ - 移動コンストラクターは自動的に生成されますか?
多くの STL コンテナーを保持する大きなクラスがあります。
コンパイラーは、これらのコンテナーをターゲットに移動するムーブ・コンストラクターを自動的に作成しますか、それとも自分で作成する必要がありますか?
c++ - 1 つのメンバーを移動できないのに、囲んでいるクラス全体を移動できないのはなぜですか?
例
コピー コンストラクターが役立つだけでなく、何かを行うとします。それで
v
o
最初に最初のラムダオブジェクトにコピーされますが、これで問題ありません。ただし、ラムダオブジェクトを移動する必要があるたびに、それらは再びコピーされます。v
移動できたとしても、そうではありません。これは、ラムダに暗黙的な移動コンストラクターo
がなく、移動コンストラクターまたは単純なコピー コンストラクターがないためです。
誰かがこの背後にある理論的根拠を説明できますか?
c++ - 移動コンストラクターを呼び出すにはどうすればよいですか?
以下のコードでは、関数 main で右辺値をオブジェクト A に割り当てるにはどうすればよいですか?
ありがとう。
c++ - ベース移動コンストラクターを明示的に呼び出すと、実際にベースコピーコンストラクターが呼び出されるのはなぜですか?
派生クラスのmovectorを介して、基本クラスのmove ctorを明示的に呼び出そうとしていますが、驚いています。、これは実際には、基本クラスのmovectorではなく基本クラスのcopyctorを呼び出します。
オブジェクトで関数を使用std::move()
して、派生したmovectorが呼び出されていることを確認しています。
コード:
プログラム出力:
ベースコピーコンストラクタ
派生移動コンストラクタ
ご覧のとおり、基本クラスのmove ctorは忘れられているので、どのように呼ぶのですか?
c++ - このコードがコピー コンストラクターを呼び出そうとしているのはなぜですか?
Visual Studio でコンパイル エラーをいじるのに途方もない時間を費やしました。コードを以下の小さなコンパイル可能な例に抽出し、IdeOne で試してみたところ、ここで確認できる同じエラーが発生しました。
B(const B&)
次のコードが代わりに呼び出そうとするのはなぜだろうと思っていますB(B&&)
:
コンストラクターを明示的に定義していないのでB(std::move(binst))
、コンパイラーを generated と呼ぶ必要がB(B&&)
ありますか?
私がに変更B
するとき
それはうまくコンパイルされます。どうしてこれなの?
例のように配置 new および move コンストラクターを使用するテンプレート クラスがあるため、これを基本クラスから修正できないと非常に不便です。私のテンプレート クラスで使用するための要件ではありません)、明示的に定義された移動コンストラクターを持つ必要があります。
c++ - 所有者を移動すると、所有者へのC++複合参照が破損します
私はこれで一日中働いているので、重要な詳細を忘れないことを願っていますが、ここに行きます。私の当初の目標は、プレーヤーの作成方法のロジックをカプセル化したプレーヤーファクトリを作成することでした。
これは次のようになります。
プレーヤー内には、複合PlayerInputComponentメンバー変数があります。このPlayerInputComponentオブジェクトは、プレーヤー入力を処理するロジックをカプセル化します。これを行うには、実際のプレーヤー自体への参照/ポインターが必要です。非常に簡単ですが、コンストラクターへの唯一のパラメーターであるため、プレーヤーへの参照を取ります。
プレーヤーオブジェクトが作成されると、その初期化子リストはそれ自体への参照をPlayerInputComponentオブジェクトに渡します。外観は次のとおりです。
イニシャライザリスト内でこれを参照解除することは通常は悪い考えであることを理解していますが、PlayerInputComponentオブジェクト内で参照を設定するために使用しているだけです。コンストラクターは次のとおりです。
何らかの理由で、プレーヤーファクトリが作成したプレーヤーのローカルコピーを返すと、参照が文字化けします。私の意図は、スタック上に作成されたプレーヤーのインスタンスを移動して、呼び出し先に割り当てることでした。これは次のようになります。
コードが実行された後、プレーヤーの複合PlayerInputComponentオブジェクトのそのプレーヤーへの参照がマングルされます。ファクトリがローカルプレーヤーオブジェクトを呼び出し先に返すときにプレーヤーの移動コンストラクターが呼び出されることを理解していますが、PlayerInputComponent内のプレーヤーの参照はどうなりますか?この問題を解決するためのより良い方法はありますか?私はこの状況で参照とポインターを持つという意味的な意味が好きですが、ポインターを使って試して同じことをしました。
プレーヤーオブジェクトがCreatePlayer()メンバー関数から移動され、「自動プレーヤー」に割り当てられたときに、PlayerInputComponentのプレーヤーへの参照に何が起こっているのかを誰かが私に説明できますか?
完全を期すために、オブジェクトの宣言を次に示します。
そしてここにプレーヤーがあります:
問題をコンパイル/デモンストレーションする正確な動作を示す小さな例を以下に再構築しました。ありがとうございました!
c++ - g++でmoveコンストラクターを使用してc++11コードをコンパイルするにはどうすればよいですか?
移動コンストラクターを使用するc++11コードをg++でコンパイルできないようです。私はこのエラーを受け取り続けます:
私が書いているプログラムはこれとはかなり異なりますが、間違いなく機能するはずの部分に切り詰めましたが、それでもエラーが発生します。
誰かが私が間違っていることを教えてもらえますか?むしろ、それを修正する方法は?
これは私のgccバージョンです:
c++ - デストラクタはこのコードのどこに隠れていますか?
次の例で、 Foo
moveコンストラクターが呼び出そうとする理由を理解するのに問題があります。~ptr
GCC 4.7:
Clang 3.1-pre:
どうしたの?copyctorsとdtorsの実行を避けるためにmoveコンストラクターを書いています。これはその実装(pimplイディオム)を隠そうとするヘッダーファイルであるためFooDeleter
、完全な型を作成することはオプションではないことに注意してください。
編集:Boの回答の後、noexcept
可能な限り追加しました(上記で編集)。しかし、エラーは同じです。