considera la siguiente función:stringstream temporal para c_str() en una sola declaración
void f(const char* str);
Supongamos que quiero generar una cadena usando stringstream y pasarlo a esta función. Si quiero hacerlo en un comunicado, probaría:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
Esto da un error: 'str()' no es un miembro de 'basic_ostream'. OK, entonces el operador < < está regresando ostream en lugar de ostringstream - ¿qué hay de devolverlo a un ostringstream?
1) ¿Es seguro este yeso?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
Ahora con esto, resulta que para el < < ("Valor:") operador de llamada, en realidad está llamando operador de ostream < < (void *) e imprimir una dirección hexadecimal. Esto está mal, quiero el texto.
2) ¿Por qué el operador < < en el std :: ostringstream() temporal llama al operador ostream? Sin duda, el temporal tiene un tipo de 'ostringstream' no 'ostream'?
¡Puedo lanzar el temporal para forzar la llamada correcta del operador también!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
Esto parece trabajar y pasa "Valor: 5" para f().
3) ¿Confío en un comportamiento indefinido ahora? Los moldes parecen inusuales.
yo sepa la mejor alternativa es algo como esto:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
... pero estoy interesado en el comportamiento de hacerlo en una sola línea. Supongamos que alguien quisiera crear una macro (dudosa):
#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));
¿Funcionaría como se esperaba?
duplicado posible de [stringstream, cuerda, y Char \ * confusión conversión] (http://stackoverflow.com/questions/1374468/stringstream-string-and-char-conversion-confusion). – jww