Ich habe diesen CodeCompiler denkt, dass "A (A &)" rvalues für einen Moment akzeptiert?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
Zu meiner Überraschung dies mit GCC und Clang ausfällt. Clang sagt zum Beispiel
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);
Warum wählen sie die erste f
, wenn der zweite f
funktioniert gut? Wenn ich die erste f
entferne, ist der Anruf erfolgreich. Was ist seltsam für mich, wenn ich Klammer Initialisierung verwenden, es funktioniert auch
int main() {
f({A()});
}
Sie alle zweiten f
nennen.
Danke! Ich kann keine solche Regel für den Fall "{...}" finden. Erklärt das, warum der '{...}' Fall funktioniert? –
@ JohannesSchaub-litb: Ich bin mir nicht sicher, tbh, du rufst die Funktion mit einer _bracked-init-Liste auf, also sind die Regeln definitiv anders. –
@ JohannesSchaub-litb Siehe [over.ics.list]. Ich denke, das hat mit [over.ics zu tun.ref]/3 (Ich habe deinen Code früher falsch gelesen): Wenn man die Teilmenge von funktionsfähigen Funktionen bildet, wird der ctor 'A (A &)' nicht als brauchbar angesehen, da er eine temporäre zu einer nichtkonstanten lvalue-Referenz bindet. – dyp