移动字符串流的.str()成员是否合法?

kam*_*aze 20 c++ rvalue move-semantics c++11

请考虑以下示例:

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

如果我要返回结果,而不是result.str()它将自动成为右值.不是结果中包含的字符串(我假设).我的期望是它被复制并且副本作为右值返回.

所以我的问题是,合法的是:

return std::move(result.str());
Run Code Online (Sandbox Code Playgroud)

我认为它是,期望流留下一个有效的空字符串.但我不确定实际做到这一点.

Bau*_*gen 24

std::ostream::str确实会返回内部字符串的副本.所以这一举动是合法的,但result.str()无论如何它都没有意义,因此std::move没有任何用处.如果有的话,它会阻碍RVO,所以不要这样做.(正如@TartanLlama在他的评论中正确指出的那样,"不要移动返回值"一般都是正确的,而不仅仅是在返回rvalues时.)

特别是,std::move它不会影响流的内部字符串对象.