Хотя оба, return std::move(local)
и return local
, работают в том смысле, что они компилируются, их поведение отличается. И, вероятно, только последний был предназначен.
Если вы пишете функцию, которая возвращает std::vector<string>
, вы должны вернуть std::vector<string>
и именно его. std::move(local)
имеет тип std::vector<string>&&
, который не a std::vector<string>
, поэтому его необходимо преобразовать в него с помощью конструктора перемещения.
Стандарт говорит в 6.6.3.2:
Значение выражения неявно
преобразован в тип возврата функции, в которой он появляется.
Это означает, что return std::move(local)
эквивалентно
std::vector<std::string> converted(std::move(local); // move constructor
return converted; // not yet a copy constructor call (which will be elided anyway)
, тогда как return local
только
return local; // not yet a copy constructor call (which will be elided anyway)
Это избавляет вас от одной операции.
Чтобы дать вам краткий пример того, что это значит:
struct test {
test() { std::cout << " construct\n"; }
test(const test&) { std::cout << " copy\n"; }
test(test&&) { std::cout << " move\n"; }
};
test f1() { test t; return t; }
test f2() { test t; return std::move(t); }
int main()
{
std::cout << "f1():\n"; test t1 = f1();
std::cout << "f2():\n"; test t2 = f2();
}
Это выдаст
f1():
construct
f2():
construct
move