C++ 移动stringstream的.str()成员合法吗?

C++ 移动stringstream的.str()成员合法吗?,c++,c++11,move-semantics,rvalue,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(); } 我假设是这样,希望流留下一个有效的空字符串。但是我觉得没有足够的把握来实际执行它。std::ostream::st

考虑以下示例:

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

我假设是这样,希望流留下一个有效的空字符串。但是我觉得没有足够的把握来实际执行它。

std::ostream::str
确实返回了内部字符串的副本。因此,移动是合法的,但没有任何意义,因为
result.str()
无论如何都是右值,因此
std::move
没有任何用处。如果有什么妨碍RVO的话,那就不要这样做。(正如他们在文章中正确指出的,“不要移动返回值”通常是正确的,而不仅仅是在返回右值时。)


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

在return语句中调用
std::move(e)
是一种反模式。返回的表达式被隐式地视为一个右值,并且使用
std::move
会禁止复制省略。@TartanLlama,你不是过分简化了吗?如果有一个函数“std::string std::ostringstream::str()&&&”,那么将函数保留为“return std::move(result).str();”不是最好的方法吗?@kamikaze是的,正如Baum所说,我指的是返回语句中所有的模式都是
std::move(e)
,其中
e
是一个表达式。@kamikaze
返回移动(e)
(坏)!=<代码>返回移动(e).smth()(可能(很少)有意义)。(由于编辑而部分重新发布。)可以将std::移动到函数的参数吗
void一些函数(std::string&output){std::stringstream ss;….output=std::move(ss.str());}
这非常简单。出于某种原因,我认为它会返回一个引用。@kamikaze当有疑问时,或者要再次检查,请咨询@kamikaze,这就是我们的目的。。)但是,如果出于任何原因想要阻止返回值优化和复制省略,这将是一种方法。
return std::move(result.str());