我对功能匹配有疑问。考虑这段代码:
main.hpp:
struct Foo
{
Foo(double = 1.0)
{
std::cout << "Foo constructor\n";
}
operator double()
{
std::cout << "Foo double\n";
return double(1.0);
}
operator int()
{
std::cout << "Foo int\n";
return int(1);
}
};
void Bar(Foo &f)
{
std::cout << "Bar Foo\n";
}
void Bar(int)
{
std::cout << "Bar int\n";
}
main.cpp中:
double d;
Bar(Foo(d));
输出:
Foo constructor
Foo int
Bar int
但是,如果我将void Bar(Foo &f)
更改为void Bar(const Foo &f)
,则输出更改为
Foo constructor
Bar Foo
即使const
不是Bar(Foo)
,我也不确定为什么Bar(int)
会导致Foo(d)
而不是const
。
答案 0 :(得分:3)
Foo(d)
是一个右值/临时值,它无法绑定到Foo&
但它可以绑定到const Foo&
,这就是为什么它可以调用void Bar(const Foo &f)
,const Foo&
比转换为int
然后转换为Bar(int)
更适合,因为这需要额外的用户定义转换。使用Foo&
时,编译器不允许调用Bar(Foo&)
,但它会看到它可以转换为int
然后调用Bar(int)
,所以它会这样做。