Если я правильно понял правила для времени жизни временных рядов, этот код должен быть безопасным, так как время жизни временного stringstream
в make_string()
длится до конца полного выражения. Я не уверен на 100%, но здесь нет тонкой проблемы, может ли кто-нибудь подтвердить, безопасен ли этот шаблон использования? Кажется, что он отлично работает в clang и 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");
}
Мне кажется, все должно быть хорошо. –
Технически это нормально, но я считаю, что вы обнаружите, что это довольно неэффективно. Рассмотрим просто определение построителя строк с помощью 'operator <<'. –
@ Cheersandhth.-Alf Зависит от того, насколько агрессивно работает компилятор. – cdhowie