Должен ли я вернуть ссылочный параметр rvalue по ссылке rvalue? ⇐ C++
-
Гость
Должен ли я вернуть ссылочный параметр rvalue по ссылке rvalue?
У меня есть функция, которая изменяет ссылки std::string& lvalue на месте, возвращая ссылку на входной параметр:
std::string& Transform(std::string& input) { // преобразуем входную строку ... обратный ввод; } У меня есть вспомогательная функция, которая позволяет выполнять те же встроенные преобразования для ссылок rvalue:
std::string&& Transform(std::string&& input) { return std::move(transform(input)); // вызывает ссылочную версию lvalue } Обратите внимание, что он возвращает ссылку на rvalue.
Я прочитал несколько вопросов по SO, касающихся возврата ссылок на rvalue (например, здесь и здесь), и пришел к выводу, что это плохая практика.
Из того, что я прочитал, кажется, что все согласны с тем, что, поскольку возвращаемые значения являются значениями r, плюс принимая во внимание RVO, простой возврат по значению будет столь же эффективным:
std::string Transform(std::string&& input) { вернуть преобразование (вход); // вызывает ссылочную версию lvalue } Однако я также читал, что возврат параметров функции препятствует оптимизации RVO (например, здесь и здесь)
Это наводит меня на мысль, что копирование произойдет из возвращаемого значения std::string& справочной версии lvalue transform(...) в >std::string возвращаемое значение.
Это правильно?
Лучше ли сохранить мою версию std::string&& Transform(...)?
У меня есть функция, которая изменяет ссылки std::string& lvalue на месте, возвращая ссылку на входной параметр:
std::string& Transform(std::string& input) { // преобразуем входную строку ... обратный ввод; } У меня есть вспомогательная функция, которая позволяет выполнять те же встроенные преобразования для ссылок rvalue:
std::string&& Transform(std::string&& input) { return std::move(transform(input)); // вызывает ссылочную версию lvalue } Обратите внимание, что он возвращает ссылку на rvalue.
Я прочитал несколько вопросов по SO, касающихся возврата ссылок на rvalue (например, здесь и здесь), и пришел к выводу, что это плохая практика.
Из того, что я прочитал, кажется, что все согласны с тем, что, поскольку возвращаемые значения являются значениями r, плюс принимая во внимание RVO, простой возврат по значению будет столь же эффективным:
std::string Transform(std::string&& input) { вернуть преобразование (вход); // вызывает ссылочную версию lvalue } Однако я также читал, что возврат параметров функции препятствует оптимизации RVO (например, здесь и здесь)
Это наводит меня на мысль, что копирование произойдет из возвращаемого значения std::string& справочной версии lvalue transform(...) в >std::string возвращаемое значение.
Это правильно?
Лучше ли сохранить мою версию std::string&& Transform(...)?
Мобильная версия