Рассмотрим следующую функцию:
void f(const char* str);
Предположим, я хочу сгенерировать строку, используя stringstream, и передать ее этой функции. Если я хочу сделать это в одном утверждении, я могу попробовать:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
Это выдает ошибку: str () не является членом basic_ostream. Итак, оператор << возвращает ostream вместо ostringstream - как насчет преобразования его обратно в ostringstream? </p>
1) Безопасен ли этот бросок?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
Теперь с этим получается, что для вызова оператора << ("Value:") это фактически вызов оператора ostream << (void *) и печать шестнадцатеричного адреса. Это неправильно, я хочу текст. </p>
2) Почему оператор << на временном std :: ostringstream () вызывает оператор ostream? Конечно, у временного есть тип «ostringstream», а не «ostream»? </p>
Я также могу привести временное значение для принудительного вызова оператора!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
Это похоже на работу и передает "Значение: 5" в f ().
3) Я полагаюсь на неопределенное поведение сейчас? Слепки выглядят необычно.
Я знаю, что лучшая альтернатива - что-то вроде этого:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
... но меня интересует, как это делать в одной строке. Предположим, кто-то хотел сделать (сомнительный) макрос:
#define make_temporary_cstr(x) (static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << x).str().c_str())
// ...
f(make_temporary_cstr("Value: " << 5));
Будет ли эта функция ожидаемой?