Hay dos cosas cuestionables que tiene en su constructor de copia.
En primer lugar, usted ha hecho constructor de copia explícita (lo cual es algo cuestionable que hacer), por lo que lo haría (en teoría) tiene que hacer:
Foo d((Foo()));
En segundo lugar, su copia constructor toma una referencia y no una referencia const
lo que significa que no puede usarlo con un Foo
temporal.
Personalmente, me gustaría eliminar explicit
del constructor de copias y hacer que tome una referencia const
si es posible.
Tenga en cuenta que el explicit
en su constructor predeterminado no tiene ningún efecto. [*] explicit
solo tiene un efecto en los constructores que pueden invocarse con un solo parámetro. Impide que se usen para conversiones implícitas. Para los constructores que toman solo cero o solo dos o más parámetros, no tiene ningún efecto.
[Nota: no puede haber una diferencia entre:.
Foo d;
y
Foo d = Foo();
pero en este caso tiene un constructor por defecto declarado el usuario por lo que este no se aplica]
Editar: [*] Acabo de comprobar esto dos veces y 12.3.1 [class.conv.ctor] dice que puede hacer una configuración predeterminada tructor explicit
. En este caso, el constructor se usará para realizar la inicialización predeterminada o value-initialization.Para ser sincero, no entiendo el valor de esto como si tuviera un constructor declarado por el usuario, entonces es un tipo que no es POD e incluso los objetos locales de tipo no POD son inicializados por defecto si no tienen un inicializador que esta cláusula dice puede ser hecha por un constructor predeterminado explicit
. Quizás alguien pueda señalar un caso de esquina en el que sí hace una diferencia, pero por ahora no veo qué efecto tiene explicit
en un constructor predeterminado.
Foo Foo Foo? ¿Huh? –
El compilador ya respondió su pregunta ... 'Foo (const Foo &)'. 'Foo d = Foo();' invoca el constructor de copia. –
+1 porque nadie parece saber la respuesta –