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 returninstrukcję, 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 Tjest 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 Tnie 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
Tjest 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
Tjest typem klasy z domyślnym konstruktorem dostarczonym przez użytkownika, wywoływany jest ten konstruktor.
- Jeśli
Tjest typem klasy z niejawnie zdefiniowanym lub = defaultdomyślnym konstruktorem ed, obiekt jest inicjowany zerem, a następnie wywoływany jest konstruktor domyślny.
- Jeśli
Tjest a std::initializer_list, to zwracana wartość jest pustą taką listą.
- W przeciwnym razie (tj. Nie
Tjest typem klasowym - zwracane typy nie mogą być tablicami), wartość zwracana jest inicjowana przez zero.