c ++函数匹配和constness

时间:2017-07-08 09:06:32

标签: c++ overloading

我对功能匹配有疑问。考虑这段代码:

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

1 个答案:

答案 0 :(得分:3)

Foo(d)是一个右值/临时值,它无法绑定到Foo&但它可以绑定到const Foo&,这就是为什么它可以调用void Bar(const Foo &f)const Foo&比转换为int然后转换为Bar(int)更适合,因为这需要额外的用户定义转换。使用Foo&时,编译器不允许调用Bar(Foo&),但它会看到它可以转换为int然后调用Bar(int),所以它会这样做。