Una domanda recente mi ha fatto riflettere sui costruttori di copie esplicite. Ecco un esempio di codice che ho provato la compilazione in Visual Studio 2005:Comportamento del costruttore esplicito della copia ed usi pratici
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;
}
Ora per le domande:
- è # 2 consentito dalla norma? Se lo è, qual è la sezione pertinente che descrive questa situazione?
- Sei a conoscenza di qualsiasi utilizzo pratico per un costruttore di copie esplicite?
[EDIT] Ho appena trovato un link divertente sulla MSDN con la stessa identica situazione, e un commento misterioso dalla funzione principale: "c viene copiato" (come se fosse ovvio). Come indicato da Oli Charlesworth: gcc non compila questo codice e credo che abbia ragione di non farlo.
Non penso che i costruttori di copie espliciti siano una buona idea. Dove hai letto di loro? – fredoverflow
Questo sembra essere risolto in VC++ 2010 - dà un errore per la riga 'passByValue (a);'. – user200783