2010-05-07 13 views
13

Soweit ich weiß, muss der Kopierkonstruktor das Format T(const T&) oder T(T&) haben. Was, wenn ich der Signatur Standardargumente hinzufügen wollte?Kopierkonstruktor mit Standardargumenten

T(const T&, double f = 1.0); 

Wäre das normkonform?

+0

Siehe [diese PR] (http://llvm.org/bugs/show_bug.cgi?id=5989) Ich habe vor einiger Zeit für einige Spiele zu kling geschickt, um damit zu spielen. –

+0

http://punchlet.wordpress.com/2009/12/03/letter-the-third/ –

Antwort

25

Ja.

§ [class.copy]/2:

Ein nicht-Template Konstruktor für Klasse X ist eine Kopie Konstruktor wenn erste Parameter vom Typ X&, const X&, volatile X& oder const volatile X& und entweder Es gibt keine anderen Parameter oder alle anderen Parameter haben Standardargumente [Beispiel:X::X(const X&) und X::X(X&,int=1) sind Kopie Konstruktoren.

6

Sie können nur zwei verschiedene Konstrukteure erstellen:

T(const T&) 
T(const T&,double) 

jedoch, was Sie haben als Copykonstruktor zulässig.

Nebenbei habe ich festgestellt, dass es in C++ im Allgemeinen keine gute Idee ist, Standardparameter zu verwenden, und es ist stattdessen viel besser, Überladungen zu verwenden, wo diejenigen mit weniger Parametern diejenigen mit mehr Parametern aufrufen, Verwendung von Standardwerten (das ist natürlich nicht möglich mit Konstruktoren in ISO C++ 2003, aber delegierende Konstruktoren sind in ISO C++ 201x erlaubt). Der Grund dafür ist, dass Standardwerte Ihren Funktionen unterschiedliche tatsächliche Signaturen geben als ihr scheinbares Verhalten, was es etwas schwierig/schmerzhaft macht, wenn Sie die Zeiger auf die Funktionen nehmen. Durch die Bereitstellung von Überladungen können Funktionszeiger für jeden möglichen Aufruftyp verwendet werden, ohne dass irgendeine Art von "Bindungs" -Mechanismus erforderlich ist, damit er funktioniert.

+1

Guter Punkt. Die Adresse von überladenen Funktionen zu nehmen ist auch ein Schmerz, IMO, aber es funktioniert zumindest. – UncleBens