Co oznacza oświadczenie
return {};
w C ++ 11 wskaż i kiedy go użyć zamiast (powiedzmy)
return NULL;
lub
return nullptr;
Co oznacza oświadczenie
return {};
w C ++ 11 wskaż i kiedy go użyć zamiast (powiedzmy)
return NULL;
lub
return nullptr;
return;
bez wartości?return;
Z drugiej stronyreturn{};
jest to poprawne, jeśli masz typ zwracany.Odpowiedzi:
return {};
wskazuje „zwraca obiekt typu zwracanego funkcji zainicjowany pustym inicjatorem listy ”. Dokładne zachowanie zależy od typu zwracanego obiektu.Z cppreference.com (ponieważ OP jest oznaczony C ++ 11, wykluczyłem reguły w C ++ 14 i C ++ 17; zapoznaj się z linkiem po dalsze szczegóły):
Przed C ++ 11, dla funkcji zwracającej a
std::string
, napisałbyś:Używając składni nawiasów klamrowych w C ++ 11, nie musisz powtarzać typu:
return NULL
ireturn nullptr
powinno być używane, gdy funkcja zwraca typ wskaźnika:Jednak
NULL
jest przestarzały od C ++ 11, ponieważ jest tylko aliasem do wartości całkowitej (0), podczas gdynullptr
jest prawdziwym typem wskaźnika:źródło
Jest to prawdopodobnie mylące:
To prawdopodobnie nie jest:
źródło
initializer_list
konstruktora, czy nie zostanie on użyty, jeśli nie jest dostępny domyślny konstruktor?return {}
NIE jest odpowiednikiemreturn SomeObjectWithADefaultConstructor{};
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 przezreturn
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ę, żereturn T{};
jest inny niżreturn {}
: w pierwszym przypadkuT{}
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, alereturn {};
powiedzie się, nawet jeśli te konstruktory nie są obecne. W związku z tymreturn 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:
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).T
jest typem klasy z domyślnym konstruktorem dostarczonym przez użytkownika, wywoływany jest ten konstruktor.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.T
jest astd::initializer_list
, to zwracana wartość jest pustą taką listą.T
jest typem klasowym - zwracane typy nie mogą być tablicami), wartość zwracana jest inicjowana przez zero.źródło
{}
, co może, ale nie musi, być wartością init.To coś w rodzaju krótkiej ręki dla nowej instancji zwracanych metod.
źródło