Was macht die Aussage
return {};
in C ++ 11 angeben, und wann es anstelle von (sagen) zu verwenden ist
return NULL;
oder
return nullptr;
Was macht die Aussage
return {};
in C ++ 11 angeben, und wann es anstelle von (sagen) zu verwenden ist
return NULL;
oder
return nullptr;
return;
ohne Wert?return;
. Andererseitsreturn{};
ist es gültig, wenn Sie einen Rückgabetyp haben.Antworten:
return {};
gibt "ein Objekt des Rückgabetyps der Funktion zurückgeben, das mit einem leeren Listeninitialisierer initialisiert wurde " an. Das genaue Verhalten hängt vom Typ des zurückgegebenen Objekts ab.Von cppreference.com (da das OP mit C ++ 11 gekennzeichnet ist, habe ich die Regeln in C ++ 14 und C ++ 17 ausgeschlossen; weitere Details finden Sie unter dem Link):
Vor C ++ 11 hätten Sie für eine Funktion, die a zurückgibt
std::string
, Folgendes geschrieben:Wenn Sie die Klammer-Syntax in C ++ 11 verwenden, müssen Sie den Typ nicht wiederholen:
return NULL
undreturn nullptr
sollte verwendet werden, wenn die Funktion einen Zeigertyp zurückgibt:Jedoch
NULL
wird , da C ++ 11 veraltet , weil es nur ein Alias auf einen ganzzahligen Wert (0) ist, währendnullptr
ein richtiger Zeigertyp ist:quelle
Das ist wahrscheinlich verwirrend:
Dies ist wahrscheinlich nicht:
quelle
initializer_list
Konstruktor hat, würde dieser nicht verwendet, wenn kein Standardkonstruktor verfügbar ist?return {}
ist NICHT gleichbedeutend mitreturn SomeObjectWithADefaultConstructor{};
return {};
bedeutet, dass dies{}
der Initialisierer für den Rückgabewert ist . Der Rückgabewert wird mit einer leeren Liste listinitialisiert.Hier einige Hintergrundinformationen zum Rückgabewert basierend auf [stmt.return] im C ++ - Standard:
Für eine Funktion, die nach Wert zurückgibt (dh der Rückgabetyp ist keine Referenz und nicht
void
), gibt es ein temporäres Objekt, das als Rückgabewert bezeichnet wird . Dieses Objekt wird von derreturn
Anweisung erstellt, und seine Initialisierer hängen davon ab, was in der return-Anweisung enthalten war.Der Rückgabewert bleibt bis zum Ende des vollständigen Ausdrucks im Code erhalten, der die Funktion aufgerufen hat. Wenn es einen Klassentyp hat, wird sein Destruktor ausgeführt, es sei denn, der Aufrufer hat die Lebensdauer verlängert und einen Verweis direkt an ihn gebunden.
Der Rückgabewert kann auf zwei verschiedene Arten initialisiert werden:
return some_expression;
- Der Rückgabewert wird kopierinitialisiert vonsome_expression
return { possibly_empty_list };
- Der Rückgabewert wird aus der Liste listinitialisiert .Unter der Annahme ,
T
ist der Rückgabetyp der Funktion, dann beachten Sie, dassreturn T{};
zu unterschiedlich istreturn {}
: in der ehemaligen, eine temporäreT{}
erstellt wird , und dann wird der Rückgabewert ist kopier initialisiert von diesem zeitlich begrenzt.Dies kann nicht kompiliert werden, wenn
T
kein zugänglicher Kopier- / Verschiebungskonstruktor vorhanden ist, ist jedoch auchreturn {};
dann erfolgreich, wenn diese Konstruktoren nicht vorhanden sind. Dementsprechendreturn T{};
können Nebenwirkungen des Kopierkonstruktors usw. auftreten, obwohl dies ein Kopierelisionskontext ist, so dass dies möglicherweise nicht der Fall ist.Hier ist eine kurze Zusammenfassung der list-Initialisierung in C ++ 14 (N4140 [dcl.init.list] / 3), wobei der Initialisierer ist eine leere Liste:
T
es sich um ein Aggregat handelt, wird jedes Mitglied von seinem Klammer-oder-Gleich-Initialisierer initialisiert, falls es eines hatte, andernfalls wie von{}
(wenden Sie diese Schritte also rekursiv an).T
es sich um einen Klassentyp mit einem vom Benutzer bereitgestellten Standardkonstruktor handelt, wird dieser Konstruktor aufgerufen.T
es sich um einen Klassentyp mit einem implizit definierten oder= default
ed-Standardkonstruktor handelt, wird das Objekt mit Null initialisiert und anschließend der Standardkonstruktor aufgerufen.T
iststd::initializer_list
, ist der Rückgabewert eine leere solche Liste.T
handelt sich um einen Nichtklassentyp - Rückgabetypen können keine Arrays sein) wird der Rückgabewert mit Null initialisiert.quelle
{}
, das möglicherweise value-init ist oder nicht.Es ist eine Art Kurzschrift für eine neue Instanz des Rückgabetyps "Methoden".
quelle