2012-01-26 9 views
5

Diamo un'occhiata a questa due funzioni:L'oggetto temporaneo sarà cancellato se non vi è alcun riferimento const ad esso?

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; 
} 

e qui ci sono due possibili chiamate di process_c_string con l'argomento restituito da get_string.

  1. Senza riferimento al riferimento restituito all'oggetto restituito di get_string.

    process_c_string(get_string().c_str()); 
    
  2. Con riferimento vincolante const all'oggetto restituito di get_string.

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

So che secondo modo è valida, ma per quanto riguarda il primo, cosa normale dire su questo caso? L'oggetto temporaneo restituito da get_string deve essere cancellato prima che lo process_c_str termini perché non vi è alcun const reference?

Nota: Entrambe le versioni sono corrette in MSVC.

risposta

6

La durata del temporaneo si estende per la lunghezza dell'espressione completa in cui è stata creata. Nel tuo caso, il temporaneo verrà distrutto ma solo dopo aver completato la chiamata a process_c_string. Finché la funzione non memorizza il puntatore per un uso successivo, stai bene.

Nel secondo caso (vincolo di riferimento), la durata di tale temporaneo è estesa per essere lo scopo del riferimento, ma in questo caso specifico sconsiglierei tale schema. Si ottiene lo stesso effetto creando una stringa locale inizializzata con il temporaneo e il codice è più semplice. (Dal punto di vista delle prestazioni, tutti i compilatori escludono la potenziale copia aggiuntiva nel codice, quindi il costo sarebbe lo stesso)

Problemi correlati