Ответ 1
Для локальных переменных не требуется std::move
их в операторе return
большую часть времени † так как язык фактически требует, чтобы это произошло автоматически:
§12.8 [class.copy] p32
Когда критерии для выполнения операции копирования выполняются или выполняются, за исключением того факта, что исходный объект является параметром функции, , а подлежащий копированию объект определяется значением lvalue, разрешением перегрузки для выбора конструктор для копии сначала выполняется так, как если бы объект был обозначен rvalue. Если сбой при перегрузке или если тип первого параметра выбранного конструктора не является ссылкой rvalue на тип объекта (возможно, с квалификацией cv), разрешение перегрузки выполняется снова, считая объект как lvalue. [Примечание. Это двухступенчатое разрешение перегрузки должно выполняться независимо от того, произойдет ли копирование. Он определяет вызывающий конструктор, если elision не выполняется, и выбранный конструктор должен быть доступен, даже если вызов отменяется. -end note]
† Копирование elision очень ограничено в том, где оно может быть применено (§12.8/31
). Одно из таких ограничений заключается в том, что тип исходного объекта должен быть таким же, как и неквалифицированный возвращаемый тип функции при обращении с оператором return. Он также неприменим для подобъектов локальных переменных, которые выходят за рамки.