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

时间:2016-03-01 15:25:51

标签: c++ c++11 move-semantics rvalue

考虑以下示例:

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

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

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

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

我认为它是,期望流留下一个有效的空字符串。但我不确定是否真的这么做。

1 个答案:

答案 0 :(得分:24)

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

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