У меня есть функция, которая изменяет std::string&
lvalue ссылки на месте, возвращая ссылку на входной параметр:
std::string& transform(std::string& input)
{
// transform the input string
...
return input;
}
У меня есть вспомогательная функция, которая позволяет выполнять одни и те же встроенные преобразования на ссылках rvalue:
std::string&& transform(std::string&& input)
{
return std::move(transform(input)); // calls the lvalue reference version
}
Обратите внимание, что возвращает ссылку rvalue.
Я прочитал несколько вопросов по SO, связанных с возвратом ссылок rvalue (здесь и here для пример), и пришли к выводу, что это плохая практика.
Из того, что я прочитал, кажется, что консенсус в том, что, поскольку значения return являются r плюс, с учетом RVO, просто возврат по значению будет таким же эффективным:
std::string transform(std::string&& input)
{
return transform(input); // calls the lvalue reference version
}
Однако я также прочитал, что возвращаемые функциональные параметры предотвращают оптимизацию RVO (например здесь и here)
Это заставляет меня думать, что копия произойдет из возвращаемого значения std::string&
ссылочной версии lvalue transform(...)
в возвращаемое значение std::string
.
Правильно ли это?
Лучше ли сохранить версию std::string&& transform(...)
?