Здравствуйте, Hard_Club, Вы писали:
H_C>Есть ли какая-то разница между данными фрагментами кода?
разницы нет (если исключить возможность специализации std::move, конечно).
В двух словах — lvalue не кастится автоматом к rvalue ref, потому что rvalue ref обычно означает, что объект, на который она указывает, будет разрушен.
A x;
A&& rvx = x;
void f(A&& x);
// f(x); // в результате такого вызова х может быть разрушен - не скомпилируется
f(rvx); // тут все хорошо - мы явно передаем rvalue ref
// теперь состояние х, скорее всего, полумертвое (зависит от того, что с ним сделали внутри f)
мы не знаем в общем случае, можно ли разрушать lvalue (потому что по умолчанию lvalue живет вплоть до своей положенной смерти). Компилятор хочет получить явное разрешение на разрушение, и ты это разрешение даешь кастом своего lvalue к rvalue ref. Именно это в явной форме и выражает вызов std::move — что тебе этот lvalue больше не нужен и его можно грохнуть, несмотря на то, что до вызова его деструктора еще далеко.
ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).
J>ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).
Вот теперь все понятно! Только не понятно чего надо делать в конце методов return std::move(tempi) — по идее тут компилятор может сам принять решение перемещать или нет.
Здравствуйте, Hard_Club, Вы писали:
J>>ЗЫ под разрушением я имею в виду состояние moved-from, а не деструктор. Обычно это состояние позволяет оживить объект присваиванием/перемещением в него (но это правило хорошего тона, а не требование языка).
H_C>Вот теперь все понятно! Только не понятно чего надо делать в конце методов return std::move(tempi) — по идее тут компилятор может сам принять решение перемещать или нет.
Если ты говоришь о возврате локального объекта (телепатия из имени tempi) — не надо делать никаких std::move, просто возвращай его как есть, компилятор все сделает за тебя (и вообще, скорее всего, просто применит copy elision).
Здравствуйте, jazzer, Вы писали:
J>Если ты говоришь о возврате локального объекта (телепатия из имени tempi) — не надо делать никаких std::move, просто возвращай его как есть, компилятор все сделает за тебя (и вообще, скорее всего, просто применит copy elision).