В comment to another question Джонатан Wakely отвечает на мое заявление:Когда требуется явное перемещение для оператора возврата?
Вам не нужно явное движение для значения локальной переменной возвращаемого функцией. Это неявное движение там
->
... никогда не говори никогда ... Вам нужен явный шаг, если локальная переменная не тот же тип, тип возвращаемого значения, например,
std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; }
, но если типы равно будет двигаться, если это возможно ...
Так что, кажется, иногда мы можем должны двигаться локальной переменной по возвращении.
Пример
std::unique_ptr<base> f() {
auto p = std::make_unique<derived>();
p->foo();
return p;
}
хороша тем, что она дает compilation error
> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
но мне интересно, есть ли хороший шанс обнаружить это в целом - и это здесь предел языковых правил или unique_ptr
??
Я первоначально отправил это предложение Майку и Ричарду на рассмотрение в Бристоль, но, похоже, они не добрались до него. :( – Xeo
Давайте нажимаем, чтобы получить его на C++ 17. Я не уверен, как изменить формулировку, хотя - текущее правило имеет преимущество простоты. –
Я думаю, мы пришли к выводу, что правило должно быть отделено от правила копирования-исключения и просто указать «если возвращаемое выражение является именем автоматической локальной переменной или функциональным параметром, переместите ее». – Xeo