Verwenden eines Konstruktors in einem Funktionsaufruf?

7

Ich habe eine Weile nach einer guten Erklärung gesucht, warum / warum nicht die folgende Verwendung des Konstruktors struct als Funktionsargument zulässig ist. Kann mir jemand einen geben?

%Vor%

Ich hatte den Eindruck, dass ein Konstruktor weder einen Rückgabetyp noch eine Aussage hat ...

    
Evan 10.03.2011, 09:51
quelle

4 Antworten

4

Es ist legal.

Sie rufen den Konstruktor nie selbst auf; Sie deklarieren gerade ein unbenanntes oder "temporäres" Objekt vom Typ Item . Sehen Sie, wie sich die Syntax entwickelt, wenn Sie das Objekt unbenannt machen:

%Vor%

Obwohl es so aussieht, als würden Sie den Konstruktor wie eine Funktion aufrufen, sind Sie das nicht.

Wie auch immer, Sie können das Temporäre als "rvalue" (weil es eins ist) in Funktionsargumenten und ähnlichem verwenden, was Sie hier tun.

Übrigens, verwenden Sie nicht die alten Header iostream.h und vector.h . Sie sind älter als 1998. In ISO Standard C ++ sollten Sie iostream bzw. vector verwenden. Standard-Header in C ++ enden nicht in ".h" (inb4, ignorieren die aus Gründen der Abwärtskompatibilität geerbten C-Header).

    
Lightness Races in Orbit 10.03.2011, 10:49
quelle
8

Es wird nicht der Konstruktor oder sein Rückgabewert an push_back übergeben. C ++ verwendet den Konstruktor tatsächlich, um ein namenloses temporäres Objekt zu erstellen, das nur für die Dauer des Funktionsaufrufs existiert. normalerweise auf dem Stapel. Dies wird dann an push_back übergeben, und push_back kopiert seinen Inhalt in Ihren Vektor.

    
moonshadow 10.03.2011 10:02
quelle
4

Dies ist zulässig, weil push_back das Argument von const als Referenz verwendet und anschließend eine Kopie des Objekts erstellt. Der Aufruf des Konstruktors erstellt ein temporäres Objekt, das ein Rvalue ist. Eine const-Referenz kann einen rvalue binden. Die Methode kann das übergebene Objekt nicht ändern, aber sie kann eine Kopie erstellen.

    
Björn Pollex 10.03.2011 09:57
quelle
3

Obwohl es wie ein Funktionsaufruf aussieht, ist der Ausdruck Element (img, i) eigentlich die Erstellung eines temporären Objekts. Der Unterschied ist, dass in der Laufzeit Speicher für das Objekt auf dem Stapel reserviert wird, und dann wird der Konstruktor aufgerufen, während, wenn dies ein regulärer Funktionsaufruf wäre, kein Speicher zugewiesen würde.

    
Tal Pressman 10.03.2011 10:02
quelle