Хотя имеет смысл копировать эту переменную (например, чтобы сохранить ее состояние перед вызовом другой функции), не имеет смысла и на самом деле было бы очень плохо перемещать ее, поскольку другие функции могут не знать, что эта переменная в настоящее время находится в неопределенном состоянии.
Здесь есть сильное неустановленное предположение о том, что на самом деле означает движение, что, вероятно, является источником путаницы. Рассмотрим тип:
class Person {
std::string name;
public:
Person(std::string);
Person(Person const& rhs) : name(rhs.name) { }
Person& operator=(Person const& rhs) { name = rhs.name; return *this; }
};
Что делает moving a Person
? Что ж, rvalue типа Person
может связываться с Person const&
... и это будет единственный кандидат ... поэтому перемещение вызовет конструктор копирования. Переезд делает копию! Это тоже не редкость - перемещение не имеет , чтобы быть разрушительным или более эффективным, чем копирование, это просто может быть.
В общем, там четыре разумные категории типов:
- Типы, для которых перемещение и копирование делают одно и то же (например,
int
) - Типы, для которых перемещение может быть оптимизацией копирования, которое потребляет ресурсы (например,
string
или vector<int>
) - Типы, которые можно перемещать, но нельзя копировать (например,
unique_ptr<int>
) - Типы, которые нельзя ни перемещать, ни копировать (например,
mutex
)
Там много типов, которые попадают в группу 1. И тип переменной, упомянутой в OP, также должен попадать в группу 1.
В этом списке заметно отсутствует тип, который можно копировать, но не перемещаемым, поскольку это имеет очень мало смысла из оперативная точка зрения. Если вы можете скопировать тип и не хотите деструктивного поведения при перемещении, просто сделайте перемещение также скопируйте тип.
Таким образом, вы можете рассматривать эти группы как своего рода иерархия. (3) расширяет (4), а (1) и (2) расширяет (3) - вы не можете действительно отличить (1) от (2) синтаксически. Следовательно, копируемые подпадают под подвижные.