Является ли законным перемещать член .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
не влияет на внутренний строковый объект потока.