考虑以下示例:
#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());
我认为它是,期望流留下一个有效的空字符串。但我不确定是否真的这么做。
答案 0 :(得分:24)
std::ostream::str
确实返回内部字符串的副本。所以这一举动是合法的,但没有任何意义,因为result.str()
无论如何都是右值,因此std::move
没有任何用处。如果有的话,它会阻碍RVO,所以不要这样做。 (正如@TartanLlama comment正确指出的那样,“不要移动返回值”一般都是正确的,而不仅仅是在返回rvalues时。)
特别是,std::move
不会影响流的内部字符串对象。