[解決済み] なぜデフォルトのmove-assignment/move-constructorがないのですか?
疑問点
私は単純なプログラマです。 私のクラスのメンバー変数は、ほとんどの場合、POD-typesとSTL-containersで構成されています。このため、代入演算子やコピーコンストラクタはデフォルトで実装されているので、めったに書く必要はありません。
これに加えて、もし私が
std::move
を使うと、assign-operator を使うことになります。
std::move
は完全に安全であることを意味します。
私は単純なプログラマなので、私が書くすべてのクラスに移動コンストラクタ/代入演算子を追加することなく、移動機能を利用したいと思います。
this->member1_ = std::move(other.member1_);...
というように実装することができます。
しかし、(少なくともVisual 2010では)そうならないのですが、何か特別な理由があるのでしょうか?
もっと重要なのは はこれを回避する方法はありますか?
更新しました。 GManNickGの回答を見ると、彼はこのための素晴らしいマクロを提供しています。そして、もしあなたが知らなかったのなら、move-semanticsを実装すれば、swapメンバ関数を削除することができます。
どのように解決するのですか?
移動コンストラクターと代入演算子の暗黙の生成は議論の的になっており、C++ 標準の最近のドラフトで大きな改訂があったため、現在利用可能なコンパイラーは暗黙の生成に関して異なる動作をする可能性があります。
この問題の歴史について詳しくは 2010 年 WG21 論文リスト を参照し、"mov" で検索してください。
現在の仕様書(N3225、11月~)には、(N3225 12.8/8)と記載されています。
もし、クラスの定義が
X
の定義が移動コンストラクタを明示的に宣言していない場合、以下の場合に限り、暗黙のうちにデフォルトとして宣言されます。
X
は、ユーザが宣言したコピーコンストラクタを持たず、かつ
X
は、ユーザが宣言したコピー代入演算子を持ちません。
X
は、ユーザが宣言した移動代入演算子を持ちません。
X
は、ユーザが宣言したデストラクタを持たず移動コンストラクタは暗黙のうちに削除されたと定義されることはないでしょう。
12.8/22 には、移動代入演算子が暗黙のうちに defaulted として宣言される場合を指定する同様の文言があります。 暗黙的な移動生成の現在の仕様をサポートするために行われた変更の完全なリストは、以下を参照してください。 N3203: 暗黙の着手の生成条件の厳格化 これは、Bjarne Stroustrup の論文で提案された解決策の1つに大きく基づいています。 N3201: 正しい方向に進む .
関連
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み】なぜC++コンパイラはoperator==とoperator!=を定義しないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] デフォルトの移動コンストラクタはメンバ単位の移動コンストラクタと同じですか?