void foo(std::vector<int> v)
Означает, что функция принимает в качестве параметра объект std::vector<int>
. Вызывающий может построить этот параметр объекта, как ему угодно, но затем он принадлежит и используется foo
.
В вызывающем абоненте у вас есть:
foo(/**compiler constructs the v parameter from whatever is here**/);
Следовательно:
vector<int> v1 = {1,2,3};
foo(v1); // This constructs the parameter `v` as a copy of `v1`.
По сравнению с
vector<int> v1 = {1,2,3};
foo(std::move(v1)); // This constructs the parameter `v` by moving from the value of `v1`.
Любой из них действителен, но они немного отличаются друг от друга.
void foo(std::vector<int>&& v)
Означает, что функция принимает ссылку в качестве параметра, который ссылается на std::vector<int>
, который находится в другом месте, а также означает, что вызывающая сторона не должна использовать параметр после того, как эта функция выполнена с ним, так как вызывающая сторона намеревается лишить законной силы некоторым способом.
Язык помогает предотвратить ошибки, либо
- , заставляя вас либо пропустить временный (поэтому вызывающий не может случайно попытаться использовать значение, на которое ссылается
vector
после foo
завершено), - или вынуждает вас вызвать
std::move
, чтобы пообещать компилятору, что вы не будете пытаться использовать значение, на которое указывает ссылка vector
после завершения foo
)