問題タブ [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 投票する
3 に答える
370 参照

c++ - 副作用のあるC++11移動コンストラクター

C ++では、コピーコンストラクターに副作用がある場合でも、コンパイラーがreturnステートメントの結果であるコピーコンストラクターの呼び出しを省略できるようにする標準の特別な句があるため、returnステートメントから呼び出されるコピーコンストラクターに依存することはできません。したがって、インスタンスのコピー構築以外のことを行うコピーコンストラクタを作成するのは悪いスタイルです。

C ++ 11標準には、特定の状況下でコンパイラーがmoveコンストラクターの呼び出しを排除できるようにする同様のステートメントがありますか?もしそうなら、それらの状況は何ですか?

0 投票する
0 に答える
206 参照

c++ - 副作用のある移動コンストラクターの代替?

クラスを提供し、それを使用した評価をサポートするライブラリを作成していますA(基本的に中置表記による代入と式)。不必要に複雑にせず、割り当てだけを見てみましょう。ユーザーは次のようなことができます。

同時に、ライブラリは操作も提供する必要があります。 let call itfuseは、任意の数のそのようなステートメントを取ります。

の有無にかかわらず、同じ構文を使用する必要がありますfuse。これを機能させるには、非標準の代入演算子 (参照を返すのではなくA、ステートメントを表すオブジェクトを返すもの) と別のassignメソッドが必要です。

Bステートメントをラップしようとします。代入操作は の破棄でトリガーされBます。

boolcalcは、このステートメントが評価を必要とするかどうかを追跡します。操作にはfuse、可変個引数ブロックが付属しています。

このセットアップには重大な欠陥があります。移動コンストラクターを呼び出すコンパイラーに依存しています。コピー省略規則のため、そのようなことはできません。

コピー/移動コンストラクターなしでそれを行う方法は?

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

visual-studio-2010 - VC10 unordered_set/map 移動コンストラクターのバグ?

VC10 (Visual Studio 2010) での unordered_set/map の移動コンストラクターは、呼び出された後に右側を未定義の状態にし、他の操作 (「挿入」など) が惨めに失敗するようです。移動代入演算子はうまく機能しているようです。ただし、法線セット/マップはすべての場合で正しく動作するようです。さらに、VC11 (Visual Studio 2012) ではすべて正常に動作しているようです。

これは VC10 での _Hash 実装のバグですか、それとも何か不足していますか? ご意見をお寄せいただきありがとうございます。

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

c++ - Move Constructorはいつ呼び出されますか?

移動コンストラクターが呼び出されるタイミングとコピーコンストラクターが呼び出されるタイミングについて混乱しています。私は次の情報源を読みました:

移動コンストラクターがC++0xで呼び出されない

C++11でセマンティクスと右辺値参照を移動します

msdn

これらのソースはすべて、複雑すぎるか(簡単な例が必要です)、moveコンストラクターの記述方法のみを示しており、呼び出し方法は示していません。より具体的にするために、私は簡単な問題を書きました:

現在、A、B、およびCはすべて異なるポインタ値を持っています。Aに新しいポインターを、BにCの古いポインターを、Cにnullポインターを持たせたいと思います。

ややオフトピックですが、これらの新機能について詳細に学ぶことができるドキュメントを提案できれば、私は感謝し、おそらくこれ以上多くの質問をする必要はないでしょう。

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

c++ - move-constructorの初期化リストでstd::moveを使用する必要があるのはなぜですか?

私が(些細な)クラスを持っているとしましょう。これは、移動構築可能で移動割り当て可能ですが、コピー構築可能またはコピー割り当て可能ではありません。

これは正常に機能します。

もちろん、これはm1右辺値ではないため、機能しません。

しかし、それを右辺値参照にキャストするでラップm1して、それを機能させることができます:std::move

ここまでは順調ですね。ここで、単一の値を保持する(同様に些細な)コンテナクラスがあるとします。

ただし、これは機能しません。

コンパイラ(私はclang4.0とg++ 4.7.2を試しました)は、の初期化リストmovableでの削除されたコピーコンストラクタを使用しようとしていると文句を言いcontainerます。繰り返しますが、ラップvalueインstd::moveすると機能します。

しかし、なぜstd::moveこの場合に必要なのですか?valueまだタイプではありませんmovable&&か?とどうvalue_(value)違うのmovable m1(movable(42))

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

c++ - ムーブコンストラクターが期待どおりに呼び出されない

私は C++0x を初めて使用し、右辺値参照に頭を悩ませ、コンストラクターを移動しようとしています。-std=c++0x で g++ 4.4.6 を使用していますが、次のコードで混乱しています。

書かれているように、コンパイラーはコピーコンストラクターを使用して main() でオブジェクトを構築することがわかりました。make_foo() 内で std::move 行を使用すると、移動コンストラクターが main() で使用されます。make_foo() 内で std::move が必要なのはなぜですか? tmp1 と tmp2 は make_foo() 内の名前付きオブジェクトですが、関数から返されると一時的になるはずだと思います。

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

c++ - C++ 合成された移動コンストラクターは、揮発性メンバーと仮想メンバーによってどのように影響を受けますか?

次のコードを見てください。

gcc-4.6.1 でコンパイルすると、次のエラーが発生します。

私が理解しているように、コンパイラは 6 行目でデフォルトの移動コンストラクターまたはコピー コンストラクターを作成できません。1 行目または 2 行目のいずれかのコメントを外すと、正常にコンパイルされます。コードは c++0x オプションなしで正常にコンパイルされるため、エラーはデフォルトのムーブ コンストラクターに関連しています。

しかし、ノード クラスの何がデフォルトの移動コンストラクターの作成を妨げているのでしょうか? 行 #3 または #4 のいずれかをコメントすると (つまり、デストラクタを非仮想にするか、データ メンバーを非揮発性にする)、再びコンパイルされますが、これら 2 つの組み合わせによってコンパイルされないのでしょうか?

もう 1 つのパズル、5 行目ではコンパイル エラーが発生しませんが、6 行目との違いは何ですか? それはすべてgccに固有ですか?または gcc-4.6.1?

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

c++ - コンストラクターのやり過ぎを移動する

割り当てられたメモリの大きなチャンクと多くのプリミティブ型のメンバーへのポインタを保持するクラスがあります。私はmoveコンストラクターに頭を悩ませていますが、これはそれを使用する絶好の機会だと思います。明らかに、ポインタは上に移動する必要がありますが、プリミティブを使用するのが良い場合はidkです。

以下は、クラスの考案された例です。

それらを移動可能にするには、動的に割り当てる必要があります。

私の質問は、ヒープに割り当てるオーバーヘッドは、移動セマンティクスによってもたらされるパフォーマンスの向上を無効にするのでしょうか?

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

c++ - 値で返すときに RVO / move 構築を強制する

コピー コンストラクターとムーブ コンストラクター、および関数を含むオブジェクト 'foo' があるとします。

標準では、コンパイラが次のことを試みると述べているようです。NRVO、右辺値参照による戻り、値による戻り、失敗。その順序で。

私のコピーコンストラクターは非常に高価なので、コンパイラーが値を返さないようにする方法はありますか?

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

c++ - 呼び出されたコピー コンストラクターも移動コンストラクターもありません

重複の可能性:
この場合、コピー コンストラクターが呼び出されないのはなぜですか?
コピー省略と戻り値の最適化とは?

次のプログラムが出力 "cpy: 0" を生成する理由を誰かに説明してもらえますか (少なくとも g++ 4.5.2 でコンパイルした場合):

この例の一見奇妙な結果を理解しようとしたときに疑問が生じました:定数データメンバーまたは参照メンバーを持つクラスの ctor を移動する