2014-11-07 124 views
11

如果我正確理解臨時對象的生命週期規則,則此代碼應該是安全的,因爲make_string()中的臨時對象stringstream的生存期會持續到完整表達式的結尾。我不是100%自信的,雖然這裏沒有一個微妙的問題,任何人都可以確認這種使用模式是否安全?它似乎在叮噹和gcc工作正常。C++臨時對象的生命週期 - 是否安全?

#include <iomanip> 
#include <iostream> 
#include <sstream> 

using namespace std; 

ostringstream& make_string_impl(ostringstream&& s) { return s; } 

template<typename T, typename... Ts> 
ostringstream& make_string_impl(ostringstream&& s, T&& t, Ts&&... ts) { 
    s << t; 
    return make_string_impl(std::move(s), std::forward<Ts>(ts)...); 
} 

template<typename... Ts> 
string make_string(Ts&&... ts) { 
    return make_string_impl(ostringstream{}, std::forward<Ts>(ts)...).str(); 
} 

int main() { 
    cout << make_string("Hello, ", 5, " World!", '\n', 10.0, "\n0x", hex, 15, "\n"); 
} 
+3

在我看來,它應該沒問題。 – 2014-11-07 03:12:01

+0

從技術上講,沒關係,但我相信你會發現效率很低。考慮使用'operator <<'定義一個字符串生成器。 – 2014-11-07 03:23:02

+0

@ Cheersandhth.-Alf取決於編譯器內聯程度如何。 – cdhowie 2014-11-07 03:23:45

回答

7

的標準的相關部分是在§12.2

12.2.3)臨時對象被銷燬作爲評價全表達式(1.9最後一步 ),該(詞法)包含它們的創建點。

除了:

12.2.4)有在其中的臨時被在不同的點比全表達式的結尾破壞兩個上下文。第一個上下文是當調用默認構造來初始化數組的元素時。 ... [不適用]

12.2.5)第二個上下文是引用綁定到臨時的時候。臨時到該參考結合或臨時即其上結合的參考持續基準的壽命除了一個子對象的完整的對象:

  • ...

  • 甲臨時綁定到函數調用中的引用參數(5.2.2)直到完成包含調用的完整表達式。

所以你去。臨時stringstream{}被綁定到函數調用中的引用,所以它一直存在直到表達式的完成。這是安全的。

+0

謝謝,那看起來非常明確:) – mattnewport 2014-11-07 03:42:49