Bonjour

En testant certains points des constructeurs de copie je suis tombé sur un petit mystère:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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?