私は 5 のルールを突き止めようとしてきましたが、オンラインの情報のほとんどは非常に複雑であり、サンプル コードは異なります。
私の教科書でさえ、このトピックをうまくカバーしていません。
移動中のセマンティクス:
私が理解しているように、テンプレート、右辺値、および左辺値は別として、移動セマンティクスは次のとおりです。
int other = 0; //Initial value
int number = 3; //Some data
int *pointer1 = &number; //Source pointer
int *pointer2 = &other; //Destination pointer
*pointer2 = *pointer1; //Both pointers now point to same data
pointer1 = nullptr; //Pointer2 now points to nothing
//The reference to 'data' has been 'moved' from pointer1 to pointer2
コピーとは対照的に、これは次のようなものと同等です。
pointer1 = &number; //Reset pointer1
int newnumber = 0; //New address for the data
newnumber = *pointer1; //Address is assigned value
pointer2 = &newnumber; //Assign pointer to new address
//The data from pointer1 has been 'copied' to pointer2, at the address 'newnumber'
右辺値、左辺値、またはテンプレートの説明は不要です。これらのトピックは無関係であると言えます。
最初の例が 2 番目の例よりも高速であるという事実は、当然のことです。また、C++ 11 より前の効率的なコードはすべてこれを行うことも指摘しておきます。
私の理解では、アイデアは、このすべての動作を標準ライブラリのきちんとした小さな演算子 move() にバンドルすることでした。
コピー コンストラクターとコピー代入演算子を記述するときは、単純に次のようにします。
Text::Text(const Text& copyfrom) {
data = nullptr; //The object is empty
*this = copyfrom;
}
const Text& Text::operator=(const Text& copyfrom) {
if (this != ©from) {
filename = copyfrom.filename;
entries = copyfrom.entries;
if (copyfrom.data != nullptr) { //If the object is not empty
delete[] data;
}
data = new std::string[entries];
for (int i = 0; i < entries; i++) {
data[i] = copyfrom.data[i];
//std::cout << data[i];
}
std::cout << "Data is assigned" << std::endl;
}
return *this;
}
同等のものは、次のようになります。
Text::Text(Text&& movefrom){
*this = movefrom;
}
Text&& Text::operator=(Text&& movefrom) {
if (&movefrom != this) {
filename = movefrom.filename;
entries = movefrom.entries;
data = movefrom.data;
if (data != nullptr) {
delete[] data;
}
movefrom.data = nullptr;
movefrom.entries = 0;
}
return std::move(*this);
}
これがうまくいかないことは確かなので、私の質問は次のとおりです。移動セマンティクスを使用して、このタイプのコンストラクター機能をどのように実現しますか?