Constructeur de copie sans "const"
Bonjour
En testant certains points des constructeurs de copie je suis tombé sur un petit mystère:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class A {
int value;
public:
A(int i) {
value = i;
cout << "A(int)" << endl;
}
A(A& other) { // const volontairement absent
value = other.value;
cout << "A(A&)" << endl;
}
};
A a1(1), a2(a1); // ok
A a3(*(new A(3))); // ok
A a4(A(4)); // ne compile pas |
J'ai compilé en -fno-elide-constructors sous g++ 3.3.3 pour être bien sûr de voir passer toutes les copies avant que le compilateur ne s'amuse à les optimiser.
Le message d'erreur est:
Code:
1 2 3
| error: no matching function for call to 'A::A(A)'
error: candidates are: A::A(int)
error: A::A(A&) |
Si je modifie le constructeur de copie en A(const A& other) le code compile et produit bien le résultat attendu (A(int), A(const A&) et a4.value = 4 au final).
Je suis perplexe... Quelqu'un peut expliquer pourquoi?