ムーブ代入演算子では、std::moveまたはstd::swapを使用する必要がありますか?
やった:
void Swap(Image& Img) {/*Swap everything here*/}
Image& Image::operator = (const Image &Img)
{
if (this != &Img) Img.Swap(*this); //Compiler error for copy assignment.. no match for swap taking const..
return *this;
}
Image& Image::operator = (Image&& Img)
{
Img.Swap(*this);
return *this;
}
IとJの2つの画像があり、次のようになっていると仮定します。
I = std::move(J);
何が起こるかというと、IとJからのデータが交換されるため、JはIのピクセルを持ち、その逆も同様です。これは正常ですか?ムーブ代入は盗んで破壊することになっていると思いましたか?JをIに移動すると、Jの内容が取得され、Jが破棄されるようになりますか?しかし、それでも私はこれらの例をネット上で見ています
同じコードがmoveコンストラクターで機能しているのを見ることができますが、これは割り当てでどのように機能しますか?意味がないようです:S
std :: moveはmoveコンストラクターでも使用する必要がありますか?コンストラクターでstd::moveを使用すると、プログラムがクラッシュします。
Image::Image(Image&& Img) : Pixels(), Info(), /*Default everything*/
{
this->Swap(Img);
Img.Pixels.clear();
}
上記のコンストラクターは機能します。ただし、コンストラクターでstd :: moveを使用する場合:
Image::Image(Image&& Img) : Pixels(std::move(Img.Pixels)), Info(std::move(Img.Info)), /*move everything*/
{
//Do I need to set Img's values to default? Or does std::move do that?
}
移動されたオブジェクトを使用しようとすると、プログラムがクラッシュします。
Image I = Image("C:/Image.bmp");
Image J = std::move(I);
I.Draw(...); //Crashes program if using std::move. If using the swap version of the constructor, it works. I assume it's because swap version defaults everything.