J'ai ce codeLe compilateur pense que "A (A &)" accepte les valeurs pour un moment?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
À ma grande surprise cela échoue avec GCC et Clang. Clang dit par exemple
Compilation finished with errors:
source.cpp:8:10: error: no matching constructor for initialization of 'A'
f(A());
^~~
source.cpp:1:21: note: candidate constructor not viable: expects an l-value for 1st argument
struct A { A(); A(A&); };
^
source.cpp:1:16: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
struct A { A(); A(A&); };
^
source.cpp:4:13: note: passing argument to parameter here
void f(A);
Pourquoi choisissent-ils le premier f
, lorsque le second f
fonctionne bien? Si je supprime le premier f
, l'appel réussit. Ce qui est plus étrange pour moi, si j'utilise l'initialisation du corset, cela fonctionne aussi bien
int main() {
f({A()});
}
Ils appellent la deuxième f
.
Merci! Je ne peux pas trouver une telle règle pour le cas {...} '. Est-ce que cela explique pourquoi le cas '{...}' fonctionne? –
@ JohannesSchaub-litb: Je ne suis pas sûr, tbh, vous appelez la fonction avec un _braced-init-list_ donc les règles sont définitivement différentes. –
@ JohannesSchaub-litb Voir [over.ics.list]. Je pense que cela a à voir avec [over.ics.ref]/3 (J'ai mal interprété votre code plus tôt): Lors de la formation du sous-ensemble de fonctions viables, le ctor 'A (A &)' n'est pas considéré comme viable car il lie temporairement une référence de lvalue non-const. – dyp