Передача по значению l по сравнению со значением в конструкторе - PullRequest
0 голосов
/ 01 мая 2020

Итак, у меня есть конструктор, который принимает vector<num>&, и они std::move по этой ссылке. Разве это объективно не лучше, чем взять vector<num>, если я собираюсь переместить аргумент?

Во втором случае, как я понимаю, гарантируется, что никакие копии не будут случайно созданы при прохождении c конструктору.

В первом случае, может быть, компилятор может оптимизировать копию с ходом, а может и нет, или, возможно, пользователь выполнит foo(std::move(my_vec));, а может и нет ... в общем, нет гарантии, что он будет перемещен.

Я понимаю, что если я буду использовать ссылку l-value, я не смогу принять временные ссылки. Есть ли другие недостатки?

1 Ответ

2 голосов
/ 01 мая 2020

Вы всегда должны отдавать предпочтение передаче по ссылке (передача std::vector<int>& или std::vector<int> const&), а не передаче по значению (просто std::vector<int>), потому что при передаче по ссылке вы избегаете ненужных копий.

Однако вы не должны использовать std::move для ссылки на l-значение. std::move используется с конструкторами перемещения, которые получают ссылку на r-значение, например:

Foo(std::vector<int>&& v)
    : v_(std::move(v))
{}
...