2015-10-01 4 views
15

Betrachten Sie das folgende Programm:Was bedeuten Ellipsen in einem Kopierkonstruktor?

#include <iostream> 
struct Test 
{ 
    int a; 
    Test() : a(3) 
    { } 
    Test(const Test& t...) 
    { 
     std::cout<<"Copy constructor called\n"; 
     a=t.a; 
    } 
    int get_a() 
    { 
     return a; 
    } 
    ~Test() 
    { 
     std::cout<<"Destructor is called\n"; 
    } 
}; 
int main() 
{ 
    Test t; 
    Test* t1=new Test(t); 
    std::cout<<t.get_a()<<'\n'; 
    std::cout<<t1->get_a()<<'\n'; 
    delete t1; 
} 

genau beobachten die drei Punkte in Parameter Copykonstruktor ich wirklich überrascht war, als ich dieses Programm ausprobiert. Was nützt es? Was heißt das?

Was sagt die Sprachspezifikation dazu?

Ich weiß, dass drei Punkte werden verwendet, um mit variabler Länge Argumente in variadische Funktionen wie printf() und scanf() etc und auch variadische Makros eingeführt durch C99 darstellen. In C++, wenn ich nicht falsch liege, werden sie in variadischen Vorlagen verwendet.
Ist dieser Code gut gebildet? Ist dieser variadische Kopierkonstruktor beliebig viele Argumente?

Es kompiliert & läuft fein auf g ++ 4.8.1 & MSVS 2010.

+6

Gleiche wie 'Test (konst Test & t, ...)' (beachten Sie das Komma) –

+1

Jeder Konstruktor, der mit einem Wert des Typs aufgerufen werden kann selbst und nimmt es mit Bezug ist eine mögliche Copykonstruktor. Die Tatsache, dass optionale weitere Argumente geliefert werden können, ist unerheblich. –

+4

@PiotrSkotnicki: Also, warum Komma ist nicht notwendig? – Destructor

Antwort

5

Der Norm-Entwurf in Abschnitt 8.3.5[dcl.fct] sagt , ... synonym mit ... es sei denn ... Teil der abstrakten-declarator ist (Hervorhebung von mir):

[...] Wenn die Parameter-Deklaration-Klausel endet mit einem Auslassungs oder einem Spaß ction parameter pack (14.5.3), die Anzahl der Argumente soll gleich oder größer als die Anzahl der Parameter sein, die kein Standardargument haben und keine Funktionsparameter sind. Wo syntaktisch korrekt und wo „...“ ist nicht Teil eines abstrakt-declarator „...“ ist ein Synonym für „...“. [...]

So es ist ein variadic function und soweit ich das ohne zusätzliche Argumente sagen kann, ist dies auch ein gültige Kopie Konstruktor aus dem Abschnitt 12.8[class.copy]:

ein nicht-Template-Konstruktor für Klasse X ist eine Kopie Konstruktor, wenn sein erster Parameter von Ty ist pe X &, const X &, flüchtig X & oder const flüchtig X &, und entweder gibt es keine anderen Parameter oder alle anderen Parameter haben Standardargumente (8.3.6).

und diese Note sagt, dass Ellipsen sind keine Parameter:

void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow 
         // a parameter with a default argument 

, die durch den normativen Text, über den gesichert wird, sagt:

Wenn die Parameter-Deklaration -clause endet mit einer Ellipse [...]

Hinweis, da es ein abstrakt-declarator gefragt wurde, ist ein declarator ohne eine Kennung.

+0

Beachten Sie, dass die erste Regel, die ich zitiere, die [berüchtigten sechs Punkte] (http://stackoverflow.com/a/33502576/1708801) ermöglicht. –

5

Was nutzt es? Was heißt das?

Ja, es führt eine variadic Funktion ein.

In C++ Wenn ich nicht falsch bin, werden sie in variadic Vorlagen verwendet.

Die Syntax und Semantik sind unterschiedlich. Es ist eine "C-style" variadic Funktion, keine variadic Vorlage Funktion. Ein Kopierkonstruktor kann zudem keine Template-Funktion sein.

A Nicht-Template Konstruktor für Klasse X ein Copykonstruktor wenn seine ersten Parameter vom Typ X ist &, const X &, volatile X & oder const volatile X & und entweder Es gibt keine anderen Parameter oder alle anderen Parameter haben Standardargumente (8.3.6).

Per §12.8.2 im endgültigen Entwurf (Hervorhebung von mir)

Ist dieser Code gut ausgebildet? Ist dieser variadische Kopierkonstruktor beliebig viele Argumente?

Wenn die Ellipse Parameter enthält, handelt es sich nicht mehr um einen Kopierkonstruktor, sondern um einen einfachen Konstruktor. Wenn nicht, dann ist es ein gültiger Kopierkonstruktor.

X(const X&, int = 1, double = 5); // copy-ctor 
X(const X&, int = 1, double); // constructor 
+0

Also kann ich sagen, dass das Programm in diesem Link keinen copy constrctor hat, da es keine Standardargumente verwendet. http://ideone.com/VuNTU5 – Destructor

+1

@PravasiMeet Richtig. – edmz

Verwandte Themen