2010-05-07 46 views
13

Per quanto ne so, il costruttore di copie deve avere il formato T(const T&) o T(T&). Cosa succede se volevo aggiungere argomenti predefiniti alla firma?costruttore di copia con argomenti predefiniti

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

Sarebbe conforme agli standard?

+0

Vedere [questa PR] (http://llvm.org/bugs/show_bug.cgi?id=5989) che ho inviato a clang qualche tempo fa per alcuni giochi con cui giocare. –

+0

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

risposta

25

Sì.

§ [class.copy]/2:

Un costruttore non template per la classe X è una copia costruttore se il suo primo parametro è di tipo X&, const X&, volatile X& o const volatile X&, e sia non ci sono altri parametri oppure tutti gli altri parametri hanno argomenti predefiniti [Esempio:X::X(const X&) e X::X(X&,int=1) sono costruttori di copia.

6

Si può solo creare due costruttori diversi:

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

Tuttavia, quello che hai è consentito come un costruttore di copia.

In una nota a margine, ho scoperto che non è generalmente una buona idea usare i parametri di default in C++, ed è invece molto meglio usare gli overload, dove quelli con meno parametri invocano quelli con più parametri, utilizzando valori predefiniti (ovviamente non è possibile con i costruttori in ISO C++ 2003, ma la delega dei costruttori è consentita in ISO C++ 201x). La ragione di ciò è che i valori predefiniti conferiscono alle funzioni diverse firme effettive rispetto al loro comportamento apparente, rendendolo alquanto difficile/doloroso quando si prendono i puntatori delle funzioni. Fornendo sovraccarichi, i puntatori di funzione di ogni possibile tipo di invocazione possono essere presi senza richiedere alcun tipo di meccanismo "vincolante" per farlo funzionare.

+1

Buon punto. Prendere l'indirizzo delle funzioni sovraccariche è un dolore, IMO, ma almeno funziona. – UncleBens

Problemi correlati