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 returndall'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 Tsia 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 Tnon 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 = defaultcostruttore 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.