У меня есть этот код
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
К моему удивлению, это не удается с GCC и Clang. Кланг говорит, например,
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);
Почему они выбирают первый f
, когда второй f
работает нормально? Если я удалю первый f
, вызов будет успешным. Что более странно для меня, если я использую инициализацию скобки, она также отлично работает
int main() {
f({A()});
}
Все они называют второй f
.