2010-05-07 22 views
13

Por lo que sé, el constructor de copia debe tener el formato T(const T&) o T(T&). ¿Qué sucede si quiero agregar argumentos predeterminados a la firma?copia constructor con argumentos predeterminados

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

¿Sería eso compatible con las normas?

+0

Ver [este PR] (http://llvm.org/bugs/show_bug.cgi?id=5989) envié un clang hace algún tiempo para que algunos juegos jugaran con eso. –

+0

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

Respuesta

25

Sí.

§ [class.copy]/2:

Un constructor no molde para la clase X es una copia constructor si su primer parámetro es de tipo X&, const X&, volatile X& o const volatile X&, y, o bien no hay otros parámetros o todos los demás parámetros tienen argumentos predeterminados [Ejemplo:X::X(const X&) y X::X(X&,int=1) son constructores de copia.

6

Usted puede simplemente crear dos constructores diferentes:

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

Sin embargo, lo que tienes es permitido como un constructor de copia.

En una nota lateral, he descubierto que generalmente no es una buena idea usar parámetros predeterminados en C++, y en cambio es mucho mejor usar sobrecargas, donde los que tienen menos parámetros invocan a los que tienen más parámetros, utilizando valores predeterminados (por supuesto que no es posible con constructores en ISO C++ 2003, pero los constructores de delegación están permitidos en ISO C++ 201x). La razón para esto es que los valores predeterminados le dan a sus funciones diferentes firmas reales que su comportamiento aparente, por lo que es algo difícil/doloroso al tomar los punteros a las funciones. Al proporcionar sobrecargas, se pueden tomar punteros de función de cada tipo de invocación posible sin requerir ningún tipo de mecanismo "vinculante" para hacerlo funcionar.

+1

Buen punto. Tomar la dirección de las funciones sobrecargadas también es doloroso, IMO, pero al menos funciona. – UncleBens

Cuestiones relacionadas