Jeśli poprawnie zrozumiem zasady dotyczące czasu istnienia tymczasników, kod ten powinien być bezpieczny, ponieważ czas życia tymczasowego jest długi do końca pełnego wyrażenia. Nie jestem w 100% pewny, że nie ma tu subtelnego problemu, czy ktoś może potwierdzić, że ten wzorzec użycia jest bezpieczny? Wygląda na to, że działa dobrze w klang i gcc.C++ czas istnienia tymczasowców - czy to jest bezpieczne?
#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");
}
Wygląda na to, że powinno być dobrze. –
Technicznie jest OK, ale uważam, że okaże się, że jest to mało wydajne. Rozważ właśnie zdefiniowanie konstruktora łańcuchów za pomocą 'operatora <<'. –
@ Cheersandhth.-Alf Zależy jak agresywnie kompilator wstawia. – cdhowie