Se comprendo correttamente le regole per la durata dei temporaries, questo codice dovrebbe essere sicuro poiché la durata del temporaneo stringstream
in make_string()
dura fino alla fine dell'espressione completa. Non sono sicuro al 100% che non ci sia un problema sottile qui, qualcuno può confermare se questo schema di utilizzo è sicuro? Sembra funzionare bene in clang e gcc.Durata dei temporari in C++ - è sicuro?
#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");
}
Mi sembra che dovrebbe andare bene. –
Tecnicamente va bene, ma credo che scoprirete che è piuttosto inefficiente. Considera solo la definizione di un generatore di stringhe con un operatore << '. –
@ Cheersandhth.-Alf Dipende dal modo in cui il compilatore è in linea. – cdhowie