return {};
oznacza, że {}
jest to inicjator wartości zwracanej . Wartość zwracana jest inicjowana listą z pustą listą.
Oto kilka informacji na temat zwracanej wartości , na podstawie [stmt.return] w standardzie C ++:
W przypadku funkcji, która zwraca wartość (tj. Typ zwracany nie jest odwołaniem i nie jest void
), istnieje obiekt tymczasowy zwany wartością zwracaną . Ten obiekt jest tworzony przez return
instrukcję, a jego inicjatory zależą od tego, co było w instrukcji return.
Wartość zwracana zachowuje ważność do końca pełnego wyrażenia w kodzie, który wywołał funkcję; jeśli ma typ klasy, to jego destruktor będzie działał, chyba że jego żywotność zostanie przedłużona przez obiekt wywołujący wiążący bezpośrednio z nim odwołanie.
Wartość zwracaną można zainicjować na dwa różne sposoby:
return some_expression;
- wartość zwracana jest inicjowana przez kopiowanie zsome_expression
return { possibly_empty_list };
- wartość zwracana jest
inicjalizowana listą z listy.
Zakładając, że T
jest to typ zwracany przez funkcję, zwróć uwagę, że return T{};
jest inny niż return {}
: w pierwszym przypadku T{}
tworzony jest tymczasowy , a następnie zwracana wartość jest kopiowana z tego tymczasowego.
Nie uda się to skompilować, jeśli T
nie ma dostępnego konstruktora kopiowania / przenoszenia, ale return {};
powiedzie się, nawet jeśli te konstruktory nie są obecne. W związku z tym return T{};
może pokazywać efekty uboczne konstruktora kopiującego itp., Chociaż jest to kontekst elekcji kopiowania, więc może nie.
Oto krótkie podsumowanie inicjalizacji listy w C ++ 14 (N4140 [dcl.init.list] / 3), gdzie inicjalizatorem jest pusta lista:
- Jeśli
T
jest agregacją, każdy element członkowski jest inicjowany z jego inicjatora nawiasu klamrowego lub równego, jeśli taki miał, w przeciwnym razie tak, jakby był przez {}
(więc zastosuj te kroki rekurencyjnie).
- Jeśli
T
jest typem klasy z domyślnym konstruktorem dostarczonym przez użytkownika, wywoływany jest ten konstruktor.
- Jeśli
T
jest typem klasy z niejawnie zdefiniowanym lub = default
domyślnym konstruktorem ed, obiekt jest inicjowany zerem, a następnie wywoływany jest konstruktor domyślny.
- Jeśli
T
jest a std::initializer_list
, to zwracana wartość jest pustą taką listą.
- W przeciwnym razie (tj. Nie
T
jest typem klasowym - zwracane typy nie mogą być tablicami), wartość zwracana jest inicjowana przez zero.