return {};
significa che {}
è l'inizializzatore per il valore restituito . Il valore restituito viene inizializzato da un elenco con un elenco vuoto.
Di seguito sono riportate alcune informazioni di base sul valore restituito , basato su [stmt.return] nello standard C ++:
Per una funzione che restituisce per valore (cioè il tipo restituito non è un riferimento e non è un riferimento void
), esiste un oggetto temporaneo chiamato valore restituito . Questo oggetto viene creato return
dall'istruzione e i suoi inizializzatori dipendono da ciò che era nell'istruzione return.
Il valore restituito sopravvive fino alla fine dell'espressione completa nel codice che ha chiamato la funzione; se ha un tipo di classe, il suo distruttore verrà eseguito a meno che non abbia la durata estesa dal chiamante che associa un riferimento direttamente ad esso.
Il valore restituito può essere inizializzato in due modi diversi:
return some_expression;
- il valore restituito è inizializzato da copiasome_expression
return { possibly_empty_list };
- il valore restituito viene
inizializzato dalla lista.
Supponendo che T
sia il tipo di ritorno della funzione, si noti che return T{};
è diverso da return {}
: nel primo, T{}
viene creato un temporaneo , quindi il valore restituito viene inizializzato dalla copia da quel temporaneo.
Questo fallirà la compilazione se T
non ha un costruttore di copia / spostamento accessibile, ma return {};
avrà successo anche se quei costruttori non sono presenti. Di conseguenza, return T{};
può mostrare effetti collaterali del costruttore di copie, ecc., Anche se questo è un contesto di elisione della copia, quindi potrebbe non esserlo.
Ecco un breve riepilogo dell'inizializzazione dell'elenco in C ++ 14 (N4140 [dcl.init.list] / 3), dove l'inizializzatore è un elenco vuoto:
- Se
T
è un aggregato, ogni membro viene inizializzato dal suo inizializzatore di parentesi graffa o uguale se ne aveva uno, altrimenti come se fosse {}
(quindi applica questi passaggi ricorsivamente).
- Se
T
è un tipo di classe con un costruttore predefinito fornito dall'utente, viene chiamato tale costruttore.
- Se
T
è un tipo di classe con un = default
costruttore predefinito definito in modo implicito o ed, l'oggetto viene inizializzato con zero e quindi viene chiamato il costruttore predefinito.
- Se
T
è a std::initializer_list
, il valore restituito è un tale elenco vuoto.
- Altrimenti (cioè
T
è un tipo non di classe - i tipi restituiti non possono essere array), il valore restituito è inizializzato con zero.