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 der return
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:
Unter der Annahme , T
ist der Rückgabetyp der Funktion, dann beachten Sie, dass return T{};
zu unterschiedlich ist return {}
: in der ehemaligen, eine temporäre T{}
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 auch return {};
dann erfolgreich, wenn diese Konstruktoren nicht vorhanden sind. Dementsprechend return 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:
- Wenn
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).
- Wenn
T
es sich um einen Klassentyp mit einem vom Benutzer bereitgestellten Standardkonstruktor handelt, wird dieser Konstruktor aufgerufen.
- Wenn
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.
- Wenn a
T
ist std::initializer_list
, ist der Rückgabewert eine leere solche Liste.
- Andernfalls (dh es
T
handelt sich um einen Nichtklassentyp - Rückgabetypen können keine Arrays sein) wird der Rückgabewert mit Null initialisiert.