Una pregunta reciente me hizo preguntarme sobre los constructores de copia explícitos. Aquí es un ejemplo de código que he intentado compilar bajo Visual Studio 2005:Comportamiento explícito del constructor de copias y usos prácticos
struct A
{
A() {}
explicit A(const A &) {}
};
// #1 > Compilation error (expected behavior)
A retByValue()
{
return A();
}
// #2 > Compiles just fine, but why ?
void passByValue(A a)
{
}
int main()
{
A a;
A b(a); // #3 > explicit copy construction : OK (expected behavior)
A c = a; // #4 > implicit copy construction : KO (expected behavior)
// Added after multiple comments : not an error according to VS 2005.
passByValue(a);
return 0;
}
Ahora para las preguntas:
- es # 2 permitido por la norma? Si lo es, ¿cuál es la sección relevante que describe esta situación?
- ¿Conoces algún uso práctico para un constructor de copia explícito?
[EDIT] Acabo de encontrar un enlace divertida en MSDN con la misma situación, y un comentario misteriosa de la función principal: "c se copia" (como si fuera obvio). Como señaló Oli Charlesworth: gcc no compila este código y creo que tiene razón para no hacerlo.
No creo que los constructores de copias explícitos sean una buena idea. ¿Dónde leíste sobre ellos? – fredoverflow
Esto parece estar corregido en VC++ 2010; da un error para la línea 'passByValue (a);'. – user200783