what str que mid library hace does cpp c_str c++ stl stdstring

c++ - que - std:: string:: c_str() y temporarios



string library c++ (3)

¿Está bien formado el siguiente código C ++?

void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator() { // returns a random std::string object } consumer(random_string_generator().c_str());

El problema que tengo con esto es que después de crear el objeto std :: string temporal y tomar el puntero c_str (), nada impide que el objeto std :: string se destruya (¿o quizás me equivoque?). ¿Me podría indicar el estándar si el código está bien a pesar de todo? Funciona, cuando pruebo con g ++.


El puntero devuelto por std::string::c_str() apunta a la memoria mantenida por el objeto de cadena. Sigue siendo válido hasta que se llama a una función no constante en el objeto de cadena, o se destruye el objeto de cadena. El objeto de cadena que le preocupa es un temporal. Se destruirá al final de la expresión completa, no antes ni después. En su caso, el final de la expresión completa es posterior a la llamada al consumer , por lo que su código está seguro. No sería si el consumer guardara el puntero en algún lugar, con la idea de usarlo más tarde.

La vida de los temporales se ha definido estrictamente desde C ++ 98. Antes de eso, variaba, dependiendo del compilador, y el código que había escrito no habría funcionado con g ++ (antes de 1995, aproximadamente, g ++ cambió esto casi de inmediato cuando el comité de estándares lo votó). (Tampoco había un std::string , pero los mismos problemas afectan a cualquier clase de string escrita por el usuario).


El temporal devuelto por la función random_string_generator () se puede usar en la función consumer () de forma segura.


La vida útil de std::string temporal se extiende más allá del punto en que el consumer regresa, por lo que es seguro usar cualquier cosa en esa cadena directamente desde el consumer . Lo que no está bien es almacenar el valor que devuelve c_str e intentar usarlo más tarde (el temporal se habrá destruido, y solo podemos adivinar qué encontrará en el otro extremo del puntero).