Functions
F.18
Для параметров «будет перемещено из» передавайте через `X&&` и используйте `std::move` для параметра
Причина
Это эффективно и устраняет ошибки на стороне вызывающего: X&& привязывается к rvalue, что требует явного std::move на стороне вызова при передаче lvalue.
Пример
void sink(vector<int>&& v) // sink принимает владение тем, чем владел аргумент
{
// обычно здесь могут быть константные обращения к v
store_somewhere(std::move(v));
// обычно после этого v не используется; он перемещён
}
Заметьте, что std::move(v) делает возможным для store_somewhere() оставить v в состоянии «после перемещения». Это может быть опасно.
Исключение
Типы с уникальным владением, которые являются только-перемещаемыми и дёшевы для перемещения, такие как unique_ptr, также можно передавать по значению — это проще для написания и даёт тот же эффект. Передача по значению создаёт одну дополнительную (дешёвую) операцию перемещения, но предпочитайте сначала простоту и ясность.
Например:
template<class T>
void sink(std::unique_ptr<T> p)
{
// используем p ... возможно std::move(p) куда-то дальше
} // p уничтожается
Исключение
Если параметр «будет перемещено из» является shared_ptr, следуйте R.34 и передавайте shared_ptr по значению.
Контроль
- Помечать все параметры
X&&(гдеXне является именем параметра шаблонного типа), в теле которых они используются безstd::move. - Помечать обращения к перемещённым объектам.
- Не выполнять условного перемещения из объектов.