DIRECT- VS COPY-INITIALISIERUNG
Durch diese Frage ( Ist es direkt-Initialisierung oder Kopier-Initialisierung? ) Ich habe die Unterschiede zwischen direct-initialization und copy-initialization gelernt:
%Vor%
Ich erwähne es hier der Vollständigkeit halber. Meine aktuellen Fragen für diese Seite sind im nächsten Abschnitt & gt; & gt;
aufgeführt
DIREKTINITIALISIERUNG VS DIREKTLISTENINITIALISIERUNG
Die Antworten zeigten, dass man innerhalb der Kategorie der Direktinitialisierung zwischen direct-initialization und direct-list-initialization unterscheiden kann.:
%Vor%
Ich weiß, dass die list-Initialisierung keine Einengungen erlaubt, so dass eine Initialisierung wie int x{3.5};
nicht kompiliert wird. Aber außerdem habe ich ein paar Fragen:
(1) Gibt es Unterschiede in der Compilerausgabe zwischen
obj s("value");
und obj s{"value"};
?
Betrachten wir einen Compiler ohne irgendwelche Optimierungen. Ich würde gerne einen möglichen technischen Unterschied wissen: -)
(2) Vielleicht sollte ich genau die gleiche Frage für eine Multi-Variablen-Initialisierung stellen, wie zum Beispiel:
obj s("val1", "val2");
und obj s{"val1", "val2"};
(3) Ich habe bemerkt, dass die Initialisierung der Liste manchmal einen anderen Konstruktor aufrufen kann, wie in:
Wie ist das möglich?
Haben wir hier alle möglichen Initialisierungen?
Aus meinen begrenzten Kenntnissen über C ++ glaube ich, dass alle möglichen Initialisierungen von Objekten (entweder native oder benutzerdefinierte typisierte Objekte) in den obigen Beispielen behandelt wurden. Ist das korrekt? Habe ich etwas übersehen?
PS: Ich lerne C ++ (ich kenne C, aber noch nicht C ++), also sei bitte nicht zu hart für mich; -)
(1) Gibt es einen Unterschied in der Compilerausgabe zwischen
obj s("value");
undobj s{"value"};
?
Betrachten wir einen Compiler ohne irgendwelche Optimierungen. Ich würde gerne jede mögliche technische wissen Unterschied: -)
(2) Vielleicht sollte ich genau die gleiche Frage für a stellen Initialisierung mehrerer Variablen, wie:
obj s("val1", "val2");
undobj s{"val1", "val2"};
%Vor%
(3) Ich habe festgestellt, dass die Initialisierung der Liste kann manchmal rufen Sie einen anderen Konstruktor auf, wie in:
Wie ist das möglich?
Wenn es einen Initialisierungslisten-Konstruktor gibt der Klassentyp obj
, wird immer in obj s{"value"};
;
Dies bedeutet, dass wenn Sie einen Konstruktor haben, der std::initializer_list<T>
als ersten Parameter verwendet und andere Parameter als Standardwerte verwendet werden, dann wird dies bevorzugt. Beispiel
std::vector<T>
und andere STL-Container haben solche Initialisierungslisten-Konstruktoren .
Andernfalls tritt die Überladungsauflösung ein und sie greift auf einen verfügbaren Konstruktor zurück, der ausgewählt wurde durch den Überladungsauflösungsprozess;
Andernfalls, wenn die Klasse keine benutzerdefinierten Konstruktoren hat und es sich um einen Aggregattyp handelt, initialisiert sie die Klassenmitglieder direkt.
Haben wir hier alle möglichen Initialisierungen?
Von meinem begrenztes Wissen über C ++, glaube ich, dass alle möglichen Initialisierungen von Objekten (entweder native oder benutzerdefinierte typisierte Objekte) haben in den obigen Beispielen behandelt worden. Ist das korrekt? Habe ich übersehen etwas?
Nein. Du hast es nicht getan. Mit Ausnahme von Referenzinitialisierung gibt es fünf Möglichkeiten, wie Objekte in C ++ initialisiert werden können.
Liste-Initialisierung garantiert von links nach rechts Reihenfolge der Argumente Auswertung. In diesem Beispiel erstellen wir std::tuple
von istream
data und geben dann das Tupel Beispiel hier aus:
Ausgabe:
%Vor%Wie Sie sehen können, wird der Unterschied gesehen, dann verwenden wir mehrmals dieselbe stream-ähnliche Ressource innerhalb von Funktionskrallen.
Auch meine Frage dazu
Tags und Links c++ c++17 list-initialization