Я пытаюсь понять, что семантика перемещения ищет конструкторы перемещения, сгенерированные компилятором (копирование и назначение).В Modern Effective C ++ Скотт Мейерс говорит в пункте № 17, что если не объявлены явные конструкторы копирования, компилятор сгенерирует конструкторы перемещения, которые будут выполнять перемещение по элементам для non-static
членов.
Чтобы подтвердить это, я пытаюсь использовать следующий код:
#include <iostream>
#include <string>
using namespace std;
class A
{
private:
std::string str;
public:
A() : str("Init string")
{
cout << "Default constructor" << endl;
}
A(std::string _str) : str(_str)
{
cout << "Constructor with string" << endl;
}
std::string getString()
{
return str;
}
};
int main() {
A obj1;
A obj2("Obj2 string");
cout << endl;
cout << "obj1: " << obj1.getString() << endl;
cout << "obj2: " << obj2.getString() << endl;
obj1 = std::move(obj2);
cout << endl;
cout << "obj1: " << obj1.getString() << endl;
cout << "obj2: " << obj2.getString() << endl;
return 0;
}
Вывод:
Default constructor
Constructor with string
obj1: Init string
obj2: Obj2 string
obj1: Obj2 string
obj2: Obj2 string
Но я ожидал, что это будет:
Default constructor
Constructor with string
obj1: Init string
obj2: Obj2 string
obj1: Obj2 string
obj2:
Поскольку obj2.str был бы перемещен и теперь имеет пустую строку.
По какой причине компилятор не генерирует конструктор назначения перемещения и не вызывает оператор копирования копии?
РЕДАКТИРОВАТЬ: Реализация оператора назначения перемещения, как показано ниже, дает ожидаемый результат (т. Е. Пустую строку после вызова std :: move)
A& operator=(A&& obj)
{
cout << "Move assignment operator" << endl;
str = std::move(obj.str);
return *this;
}