7

Sto scrivendo una funzione generica come di seguito.C++ sull'inizializzazione generica nei modelli

template<class Iterator, class T> 
void foo(Iterator first, Iterator last) { 
    T a; 
    cout << a << endl; 
    // do something with iterators 
} 

typedef vector<double>::iterator DblPtr; 
vector<double> values; 
foo< DblPtr, int>(); 

Questa funzione stampa un valore non definito per la variabile a, mentre se cambio l'inizializzazione in

/// 
    T a = T() 
    cout << a << endl; 
    // do something with iterators 

posso vedere che il valore inizializzato è 0 come mi aspetto.

Se chiamo T a la variabile viene inizializzata con il valore di default, ma se chiamo T a = T() credo che grazie all'ottimizzazione del costruttore di copia dovrebbe essere chiamato con il valore di T() che è ancora quella di default.

Non riesco a capire qual è la differenza dietro queste 2 righe e il motivo per cui ciò accade?

risposta

11

Innanzitutto, l'inizializzazione predefinita dei tipi predefiniti come int non li rende inizializzati. L'inizializzazione del valore li lascia zero inizializzati. Per quanto riguarda il tuo esempio

Questa è un'inizializzazione di default:

T a; 

Questa è una di inizializzazione del valore, utilizzando copy initialization:

T a = T(); 

Hai ragione che le copie possono essere eliso qui, quindi questo ha l'effetto della creazione di un oggetto T inizializzato a valore singolo. Tuttavia, richiede che T sia copiabile o trasferibile. Questo è il caso dei tipi built-in, ma è una restrizione da tenere a mente.

La sintassi di inizializzazione copia è necessario perché si tratta di una dichiarazione di funzione:

T a(); 

ma C++ 11 si consente al valore di inizializzare in questo modo:

T a{}; 
+0

grande spiegazione! Tutto chiaro ora e grazie mille. –