2012-01-26 4 views
5

permite echar un vistazo a estas dos funciones:¿Se eliminará el objeto temporal si no hay referencia de referencia a él?

std::string get_string() 
{ 
    std::string ret_value; 
    // Calculate ret_value ... 
    return ret_value; 
} 

void process_c_string(const char* s) 
{ 
    std::cout << s << endl; 
} 

Y aquí hay dos posibles llamadas de process_c_string con el argumento devuelto por get_string.

  1. Sin unión referencia const para el objeto devuelto de get_string.

    process_c_string(get_string().c_str()); 
    
  2. con la unión de referencia const para el objeto devuelto de get_string.

    const std::string& tmp_str = get_string(); 
    process_c_string(tmp_str.c_str()); 
    

sé que la segunda forma es válida, pero ¿qué pasa con la primera, ¿qué norma decir sobre este caso? ¿Se eliminará el objeto temporal devuelto por get_string antes de que process_c_str haya terminado porque no hay const reference?

Nota: Ambas versiones son correctas en MSVC.

Respuesta

6

La vida útil del temporal se extiende por la longitud de la expresión completa en la que se creó. En su caso, el temporal se destruirá, pero solo después de que se complete la llamada al process_c_string. Siempre que la función no almacene el puntero para un uso posterior, está bien.

En el segundo caso (encuadernación de referencia), la duración de ese temporal se amplía para ser el alcance de la referencia, pero desaconsejaría ese patrón en este caso particular. Obtiene el mismo efecto creando una cadena local inicializada con el temporal y el código es más simple. (Desde el punto de vista del rendimiento, todos los compiladores eliminan la posible copia adicional en el código, por lo que el costo sería el mismo)

Cuestiones relacionadas