Является ли законным перемещать член .str() строки?

Рассмотрим следующий пример:

#include <sstream>
template <typename T>
inline std::string to_string(T const & op) {
    std::ostringstream result;
    result << op;
    return result.str();
}

Если бы я должен был вернуть результат, вместо result.str() он автоматически стал rvalue. Не так строка, содержащаяся в результате (я предполагаю). Мое предположение состоит в том, что оно копируется и копия возвращается как rvalue.

Итак, мой вопрос здесь, законно ли:

return std::move(result.str());

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

Ответы

Ответ 1

std::ostream::str действительно возвращает копию внутренней строки. Таким образом, этот шаг является законным, но он не имеет смысла, так как result.str() в любом случае является значимым значением, и поэтому std::move не делает ничего полезного. Во всяком случае, это мешает RVO, так что не делайте этого. (Как @TartanLlama правильно указало в их комментарии, "Не перемещать возвращаемое значение" в целом верно, а не только при возврате значений r).

В частности, std::move не влияет на внутренний строковый объект потока.