Должен ли я вернуть ссылочный параметр 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(...)?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Зачем передавать по ссылке rvalue (&&) вместо передачи по ссылке (&)? [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Что означает, что x имеет ссылочный тип rvalue, но выражение x является lvalue?
Anonymous » » в форуме C++ - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Назначьте ссылочный параметр для ostream для ссылки на переменную-член [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-