[解決済み] 移動したオブジェクトはどうすればいいですか?
2022-04-28 04:48:27
質問
オブジェクトを移動させた後、そのオブジェクトに対して何ができるかを規格は正確に定義しているのでしょうか?私は、移動元のオブジェクトに対してできることは破壊だけだと思っていましたが、それでは十分ではありません。
例えば、関数テンプレート
swap
標準ライブラリで定義されているように
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
もちろん、moved-fromオブジェクトに代入することは可能でなければなりません。そうでなければ、2行目と3行目は失敗します。では、moved-fromオブジェクトで他に何ができるのでしょうか?規格のどこにその詳細があるのでしょうか?
(ちなみに、なぜ
T c = std::move(a);
ではなく
T c(std::move(a));
を1行目に入れるか)
どのように解決するのですか?
移動したオブジェクトは、不特定だが有効な状態で存在する。このことは、そのオブジェクトがもうあまり多くのことをできないかもしれない一方で、そのすべてのメンバー関数がまだ定義された振る舞いを示すべきであることを示唆しています。
operator=
- そして、そのすべてのメンバーが定義された状態にあり、なおかつ破壊を必要とする。UDTごとに異なるため、Standardでは具体的な定義はありませんが、Standardの型の仕様を見つけることができるかもしれません。コンテナのようなものは比較的明白で、中身を移動させるだけであり、空のコンテナは明確に定義された有効な状態である。プリミティブは移動元のオブジェクトを変更することはない。
余談:確か
T c = std::move(a)
で、移動コンストラクタ (移動がない場合はコピーコンストラクタ) が明示的であれば、この関数は失敗します。
関連
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】C++11のラムダ式って何?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] std::moveとstd::forwardの違いは何ですか?