移动字符串流的 .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
不会影响流的内部字符串对象。
考虑以下示例:
#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
特别是,std::move
不会影响流的内部字符串对象。