Mam ten kodKompilator myśli, że "A (A &)" akceptuje rvalues na chwilę?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
ku mojemu zdziwieniu to zawiedzie z GCC i Clang. Dzyń mówi na przykład
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);
Dlaczego oni wybrać pierwszą f
, gdy drugi f
działa poprawnie? Jeśli usuniemy pierwszy kod f
, to połączenie powiedzie się. Co jest bardziej dziwne dla mnie, jeśli mogę użyć inicjalizacji nawiasów, również działa dobrze
int main() {
f({A()});
}
Wszyscy nazywają drugą f
.
Dzięki! Nie mogę znaleźć takiej reguły w przypadku "{...}". Czy to wyjaśnia, dlaczego przypadek '{...}' działa? –
@ JohannesSchaub-litb: Nie jestem pewien, tbh, wywołujesz funkcję z _braced-init-list_, więc zasady są zdecydowanie inne. –
@ JohannesSchaub-litb Zobacz [over.ics.list]. Myślę, że ma to związek z [over.ics.ref]/3 (błędnie odczytałem twój kod wcześniej): Podczas tworzenia podzbioru funkcjonalnych funkcji, ctor 'A (A &)' nie jest uważany za wykonalny, ponieważ wiąże tymczasowe z referencją o stałej wartości l. – dyp