копирование?
Ну вообще, как в классе написан конструктор перемещения, так оно и работает. Можно посмотреть реализацию таких классов, которые чем-то владеют на куче, например string или vector. По сути, они просто передают указатели на данные другому объекту (свои указатели устанавилвают на null, чтобы в деструкторе проверить, нужно ли освободжать память или нет). Если конструктор перемещения реализован автоматически, то насколько я знаю, он просто делает move всех своих полей.
struct Foo { int values[100]; bool flagA; bool flagB; }; struct Bar { Foo foo1; Foo foo2; }; int main() { Foo f; Foo fCopy = std::move(f); Bar b; Bar bCopy = std::move(b); return 0; } In the case of both Foo and Bar there is no meaningful way to move the data from one to another because both are ultimately aggregates of POD types - none of their data is indirectly owned (points to or references other memory). So in these cases, the move is implemented as a copy and originals (f, b) remain unaltered after the assignments on the std::move() lines. Move semantics can only be meaningfully implemented with dynamically allocated memory or unique resources.
Мув ничего не копирует и не перемещает. Если тип не поддерживает мув операции, то в месте, где требуется копирование, произойдет копирование, а не мув
Обсуждают сегодня