請看下面的例子:移動stringstream的.str()成員是否合法?
#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());
我會假設它是,期待留下一個有效的,空字符串流。但我不確定是否真的這樣做。
在return語句中調用'std :: move(e)'是一種反模式。無論如何,返回的表達式都被隱式地視爲一個右值,並且使用'std :: move'禁止了copy-elision。 – TartanLlama
@TartanLlama你不是簡單化嗎?如果有一個函數「std :: string std :: ostringstream :: str()&&」,會不會最好的方式離開函數「返回std :: move(result).str();」? – kamikaze
@kamikaze是的,Baum說我指的是你的return語句中所有的模式都是'std :: move(e)',其中'e'是一些表達式。 – TartanLlama