2015-03-26 21 views
11

Una stringa stringa regolare letterale ha la seguente definizione:Perché si sta restituendo un riferimento a una stringa letterale come riferimento a un riferimento temporaneo?

ordinaria stringhe e UTF-8 stringhe sono anche denominati come strette stringhe letterali. Un letterale stringa stretto ha tipo "array di n const char", dove n è la dimensione della stringa come definita di seguito, e ha durata di archiviazione statica (3.7).

Sto assumendo perché ha una durata di archiviazione statica e che in genere sono posizionati nella ROM, non è davvero un grosso problema se c'è un riferimento ciondolante ad esso. Il seguente codice emette un avvertimento

const char* const & foo() 
{ 
    return "Hello"; 
} 
// warning: returning reference to temporary [-Wreturn-local-addr] 

Ma questo va bene, anche senza la parola chiave static

const char* const & foo() 
{ 
    const char* const & s = "Hello"; 
    return s; 
} 

Allora, qual è la differenza tra i due?

+3

Il codice non restituisce un riferimento a una stringa letterale. Restituisce un riferimento a un puntatore. La maggior parte di ciò che citi è irrilevante per il codice. –

+2

Da dove viene la tua citazione? Dovresti aggiungerlo. – dhein

+0

Perché stai restituendo un riferimento a un puntatore del char invece del puntatore del char stesso? – CodesInChaos

risposta

8

Non c'è differenza. In entrambi i casi, si restituisce un riferimento a un puntatore che non esiste più.

Che il pointee (dati) esiste ancora per sempre è irrilevante.

10

La citazione che hai postato dice che

Una stringa stretta letterale è di tipo “array di n const char”

Cioè, il tipo di "Hello" è const char[6].

Il codice restituisce un riferimento a const char *. Ciò significa che la conversione da matrice a puntatore deve essere applicata alla stringa letterale, risultante in un valore di prvalore (= temporaneo) di tipo const char *. Quindi si associa a un riferimento e si restituisce tale riferimento. Il riferimento diventa penzolante non appena termina l'ambito della funzione e il puntatore temporaneo viene distrutto.

2
const char* const & s = "Hello"; 

Qui la variabile viene creata in pila ... e che variabile (che risulta essere un puntatore) indica una posizione di memoria in cui è memorizzata la stringa-letterale. Sei non restituendo lo string-literal stesso; stai piuttosto tornando il riferimento alla variabile verrà presto distrutto a seguito dello stack-unwinding. Quindi la restituzione del riferimento a tale variabile è pericolosa, in quanto è un oggetto temporaneo.