2016-03-01 20 views
16

請看下面的例子:移動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()); 

我會假設它是,期待留下一個有效的,空字符串流。但我不確定是否真的這樣做。

+10

在return語句中調用'std :: move(e)'是一種反模式。無論如何,返回的表達式都被隱式地視爲一個右值,並且使用'std :: move'禁止了copy-elision。 – TartanLlama

+1

@TartanLlama你不是簡單化嗎?如果有一個函數「std :: string std :: ostringstream :: str()&&」,會不會最好的方式離開函數「返回std :: move(result).str();」? – kamikaze

+0

@kamikaze是的,Baum說我指的是你的return語句中所有的模式都是'std :: move(e)',其中'e'是一些表達式。 – TartanLlama

回答

20

std::ostream::str確實返回內部字符串的副本。所以這個舉動是合法的,但它是沒有意義的,因爲result.str()是一個右值,因此std::move沒有任何用處。如果有的話,它會阻礙RVO,所以不要這樣做。 (如@TartanLlama正確地在他comment指出,返回右值不只是當「別動,返回值」持有一般真實。)

尤其是std::move不影響內部的字符串對象流。

+0

這很令人尷尬。出於某種原因,我認爲它返回了一個參考。 – kamikaze

+1

@kamikaze如果有疑問或仔細檢查,請參考[documentation](http://en.cppreference.com/w/cpp/io/basic_stringstream/str) – NathanOliver

+1

@kamikaze這就是我們[文檔](http:///en.cppreference.com/w/cpp/io/basic_ostringstream/str)。 ;) –

相關問題