2013-06-21 11 views
11

Quale meccanismo è coinvolto, se al ritorno tipi, che sono costruibili dalle liste di inizializzazione, non specificare il tipo sto tornando, come in:ritorno inizializzatore di lista

std::array<int, 3> make_array() 
{ 
    return { 1, 2, 3 }; 
} 

invece di

std::array<int, 3> make_array() 
{ 
    return std::array<int, 3>{ 1, 2, 3 }; 
} 

Sono previste sanzioni per le prestazioni, se restituisco l'elenco di inizializzazione senza specificare un tipo? Sto effettivamente restituendo un array, che viene convertito in un std::array?

+0

sembra troppo ordinata per essere senza penalità, non è vero? ;-) Ma sono sicuro che 'litb' sia corretto. Ciò è molto utile con 'inizializzazione uniforme': possiamo usare questa notazione con tipi personalizzati senza dover codificare un costruttore prendendo una 'std :: initializer_list': il compilatore converte implicitamente l'elenco rinforzato nel normale ctor. Quindi, salviamo la ripetizione di scrivere di nuovo il tipo al ritorno. –

risposta

16

Non sono previste penalità prestazionali. Il valore di ritorno è costruito equivalente

std::array<int, 3> x = { 1, 2, 3 }; 

Non v'è neppure una singola copia o spostare di un std::array un'istanza coinvolti.

2

Il meccanismo è solo un costruttore:

struct X {}; 

struct Y { 
    Y(X); 
}; 

Y f() { 
    X x; 
    return x; 
} 
+0

... in che modo questo si riferisce agli elenchi di inizializzatori? –

Problemi correlati