Возвращаемое значение rvalue против возврата по значению в типе возврата функции

В моем коде у меня есть функция, которая создает строку из части данных, а затем возвращает ее. Эта строка больше нигде не используется, поэтому принимающая сторона может использовать для нее перемещение-назначение или перемещение-инициализацию.

std::string ReadString(...) {
    ...
    return std::string(...)
}

Это в основном то, что у меня есть. Есть ли смысл в том, чтобы функция возвращала тип std::string&&, поскольку возвращаемое значение является rvalue?

std::string&& ReadString(...) {
    ...
    return std::string(...)
}

Меня беспокоит то, что при возврате нашей строки может быть сделана избыточная копия, и это можно облегчить, сделав возвращаемый тип ссылкой на rvalue.

Я подозреваю, что компилятор может также быть в состоянии оптимизировать для этих сценариев, однако я не уверен.

Итак, вопрос в том, есть ли смысл делать возвращаемый тип ссылкой на rvalue в этом случае и почему? Кроме того, если нет, то каковы возможные приложения для функций, возвращающих rvalue-ссылки?

Благодарю.

1 ответ

Решение

Возвращать ссылку на объект, который должен быть уничтожен, всегда неправильно: указанный объект будет уничтожен, прежде чем его можно будет использовать в любой форме. Если сделать ссылку ссылкой на rvalue, это не изменится, а просто вернет временную компиляцию.

Обратите внимание, что возврат временной строки по значению, вероятно, приведет к удалению копии, т. Е. Объект, вероятно, будет создан непосредственно в том месте, где он используется. Если этого не произойдет, объект будет перемещен, если есть конструктор перемещения для возвращаемого типа (есть для std::string). Обратите внимание, что то же самое относится и к возвращению локальной переменной функции вместо временной.

Другие вопросы по тегам