2015-11-25 5 views

Antwort

8

Dies wird durch den Standard angegeben (alle Zitate aus N3337).

T x{}; ist Listeninitialisierung.

[dcl.init.list]/1: List-Initialisierung ist die Initialisierung eines Objekts oder eine Referenz von einem verspannt-init-list.Such ein Initialisierer wird eine Initialisierer Liste genannt, und die durch Kommata getrennte Initialisierer-Klauseln der Liste werden die Elemente genannt der Initialisierungsliste . Eine Initialisierungsliste ist möglicherweise leer. [...]

Die anwendbare Definition für list-Initialisierung:

[dcl.init.list]/3: List-Initialisierung eines T-Objekt oder Referenz vom Typ wie folgt definiert ist:

  • [eine Menge nicht anwendbar Regeln]
  • Andernfalls, wenn die Initialisierungsliste keine Elemente enthält, wird das Objekt initialisiert.

So für das Formular integrierte Typen ist Wert-Initialisierung:

[dcl.init]/7: Um Wert zu initialisieren bedeutet ein Objekt vom Typ T:

  • [nicht- anwendbare Regeln]
  • Andernfalls wird das Objekt auf Null initialisiert.

So, jetzt suchen wir Null-Initialisierung (ja, C++ hat eine Menge von Arten der Initialisierung):

[dcl.init]/5: auf Null initialisieren ein Objekt oder eine Referenz T vom Typ bedeutet:

  • T wenn ein Typ Skalar ist (3.9), wird das Objekt auf den Wert 0 (Null) genommen als integraler konstanter Ausdruck, umgewandelt T;
  • [...]

Yay, skalare Typen ([basic.types]/9, wenn Sie mir nicht vertrauen), da arithmetische Typen sind, diese Formen sowohl initialisieren ihre Objekte mit 0.

+0

Es ist immer schwer zu konkurrieren (in welchen Stunden schläfst du? ;) ... Danke für die tolle Demonstration, wie man den Standard benutzt! –

3

Ja, dies wird durch den Standard garantiert: Dies ist tatsächlich value-initialization.

Insbesondere den Punkt 4) auf der Seite sehen: es heißt, dass es value-initialization sein muss:

Wert Initialisierung wird in diesen Situationen durchgeführt:
...
4), wenn ein Die benannte Variable (automatisch, statisch oder Thread-lokal) wird mit dem Initialisierer deklariert, der aus zwei geschweiften Klammern besteht.

Und auf der gleichen Seite, sehen Sie, dass die Wirkung von value-initialization für integrierte Typen ist sie (eckige Klammern sind ich) mit 0 zu initialisieren:

Die Auswirkungen des Wert der Initialisierung sind:
...
4) Andernfalls [wenn Nicht-Klasse, Nicht-Array-Typ], wird das Objekt Null-initialisiert.

1

Das Formular int i{}; heißt value initialization.

Verkürzter:

Die Effekte der Initialisierungswert sind:
[...]
4) Otherwise [T, wenn nicht eine Klasse oder Array-Typ ist], wird das Objekt Null initialisiert.

+0

Danke. Ich habe etwas in 8.5 Initializers gefunden, die ein wenig anders aussehen als Ihr Zitat. Woher kommt dein Zitat? – InsideLoop

+0

Von der cppreference Seite verlinkt. Beim Betrachten von N4140 erscheint ein sehr ähnlicher Abschnitt in [8.5 * initializers *]/8: 'Um ein Objekt des Typs T zu value-initialisieren bedeutet: [...]' – melak47

Verwandte Themen