我有这个代码
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
令我惊讶的是,这在 GCC 和 Clang 中失败了。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
。