#include<vector>
struct A { int a[100]; };
void foo (const A& a) {
std::vector<A> vA;
vA.push_back(std::move(a)); // how does move really happen?
}
int main() {
A a;
foo(a);
}
Приведенный выше код компилируется в порядке. Теперь везде написано, что move
позволяет избежать копирования.
Ниже приведены мои запросы:Does std :: перемещение работы с ссылками lvalue? Как std :: перемещение работы на стандартных контейнерах?
- ли
move
действительно работают, когда один имеет дело с Lvalue [не] -const
ссылки? - Даже с «ссылкой на rvalue», как избежать копирования, когда объект вставлен в стандартный контейнер, как указано выше?
, например.
void foo (A&& a) { // suppose we invoke this version
std::vector<A> vA;
vA.push_back(std::move(a)); // how copy is avoided?
}
Он работает в том смысле, что 'std :: move (a)' создает 'const A &&' (помните, что 'std :: move' просто передает свой аргумент в ссылку rvalue). Но нет такой вещи, как 'push_back (const A &&)' - только 'push_back (const A &)' и 'push_back (A &&)' -, и первая будет вызвана, в результате чего произойдет копия (так как вы не можете привязать константу rvalue ref к не-const rvalue ref, но вы можете привязать ее к ссылке const lvalue). – peppe
Что значит «как избежать копирования?». Вы спрашиваете, как реализуется «вектор :: push_back (T &&)»? –
@SteveJessop, в некотором смысле Да. Но я бы не стал подробно останавливаться на этом. Мой основной вопрос заключается в том, что, поскольку «A && a», исходящий извне, может быть создан в определенном месте. 'std :: vector' - непрерывный контейнер. Как можно вообще избежать копирования? – iammilind