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

Is it legal to move the .str() member of a stringstream?

考虑以下示例:

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

如果我要 return 结果 ,而不是 result.str(),它会自动变成一个右值。结果中包含的字符串不是这样(我假设)。我的期望是它被复制并且副本 returned 作为右值。

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

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

我假设它是,期望流中留下一个有效的空字符串。但是我觉得没有足够的把握去做。

std::ostream::str确实是returns内部字符串的一个副本。所以此举是合法的,但它没有任何意义,因为 result.str() 无论如何都是一个右值,因此 std::move 没有任何用处。如果有的话,它会阻碍 RVO,所以不要这样做。 (因为 @TartanLlama correctly pointed out in their "Don't move the return value" 通常适用,而不仅仅是在返回右值时。)

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