如果我正確理解臨時對象的生命週期規則,則此代碼應該是安全的,因爲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");
}
在我看來,它應該沒問題。 – 2014-11-07 03:12:01
從技術上講,沒關係,但我相信你會發現效率很低。考慮使用'operator <<'定義一個字符串生成器。 – 2014-11-07 03:23:02
@ Cheersandhth.-Alf取決於編譯器內聯程度如何。 – cdhowie 2014-11-07 03:23:45