私はc ++ 11での移動操作の初心者なので、それで遊んでいます。しかし、私が理解できない何かを見つけました。
#include <iostream>
using namespace std;
class A{
public:
A(){cout << "default ctor" << endl;}
A(const string& str):_str{str}{cout << "parameter ctor" << endl;}
A(A&& obj):_str{std::move(obj._str)}{cout << "move ctor" << endl;}
A& operator =(A&& rhs){_str = std::move(rhs._str);cout << "move assignment operation" << endl; return *this;}
void print(){cout << _str << endl;}
private:
string _str;
};
int main(){
A a("rupesh yadav"); // parameter ctor
A b(std::move(a)); // move ctor
cout << "print a: ";
a.print(); // NOT printing --> CORRECT!!
cout << "print b: ";
b.print(); // printing --> CORRECT!!
b = std::move(a); // i don't know may be silly but still lets do it WHY NOT!!!, could be just mistake??
cout << "print a: ";
a.print(); // printing --> WRONG!!
cout << "print b: ";
b.print(); // NOT printing --> WRONG!!
}
オブジェクトにb = std::move(a)
もう一度移動を適用しているため、操作が異なる動作をすることを期待していましたが、左側のオブジェクトbを右側のオブジェクトaにコピーしていますが、この部分はわかりません。
または、プログラミングで何か間違ったことをしました。移動操作で何か間違っている場合は助けてください。
編集:これは未定義の動作であることを知っています。私の疑問は、もう一度行う場合、オブジェクトaからオブジェクトbにコピーすることです。もう一度同じことを行う場合、オブジェクトbをオブジェクトaにコピーしますか?
したがって、フォームを左から右、右から左にコピーしているのはなぜですか?