Ответ 1
Это нормально с или без std::move
. Имя локальной переменной * рассматривается как rvalue в операторе return
, в результате чего в обоих случаях вызывается конструктор перемещения. Авторы предположительно использовали std::move
по стилистическим соображениям, чтобы было ясно, что блокировка перемещается. Это мешает NRVO, но стоимость перемещения unique_lock
здесь, вероятно, минимальна по сравнению со стоимостью блокировки и ожидания.
В словах @Deduplicator это "пессимизация, чтобы подчеркнуть фактическую семантику".
Вы можете проверить это самостоятельно - unique_lock
не может быть скопирован, поэтому return head_lock;
не будет скомпилирован, если бы это была копия.
* Это правило С++ 14. Правило С++ 11 ограничено случаями, когда разрешение на копирование разрешено или разрешено, за исключением того факта, что переменная является параметром функции. Эта разница несущественна в этом вопросе, так как head_lock
, очевидно, подходит для копирования.Суб >