常量引用如何产生影响?

时间:2016-01-04 01:57:32

标签: c++

我不明白为什么以下代码不起作用:

#include <iostream>
using namespace std;

class PayOff{};
class PayOffCall : public PayOff{};

class PayOffBridge{
public:
    PayOffBridge( PayOff& innerPayOff){};
};

class VanilaOption{
public:
   VanilaOption(PayOffBridge& ThePayOff_){cout << " test " <<endl;}
};


int main () {
PayOffCall thePayOff;
VanilaOption theOption(thePayOff);
  return 0;
}

出于某种原因,在VanilaOption类(下面的代码)中更改对const的引用使其工作,有人可以解释它是如何工作的吗?我得到的错误是:没有匹配函数来调用'VanilaOption :: VanilaOption(PayOffCall&amp;)'

但它并没有帮助我弄明白。

class VanilaOption{
public:
   VanilaOption(const PayOffBridge& ThePayOff_){cout << " test " <<endl;}
};

我也不明白为什么在PayOffBridge引用预期有效时传递PayOffCall引用,有人可以帮我解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

原始代码不起作用,因为thePayOff不是PayOffBridge类型的值,而是类型PayOffCall

修改后的代码有效,因为它允许从PayOffBridge对象的PayOff子对象构造临时PayOffCall对象,然后从中构造VanillaOption对象临时。那是因为:

  1. PayOffBridge构造函数是非显式的,
  2. 派生类的左值可以转换为任何可访问基类的左值,并且
  3. 因为temporaries可以绑定到const lvalue引用(但不能绑定到非const lvalue引用)。
  4. 换句话说,const引用版本允许代码如下:

    VanilaOption theOption(PayOffBridge(thePayOff));
    //                     ^^^^^^^^^^^^^^^^^^^^^^^-----< temporary
    

    对于非const版本,你需要一个可变的左值,或许像:

    PayOffBridge b(thePayOff);
    VanilaOption theOption(b);
    //                     ^----- lvalue
    

答案 1 :(得分:1)

PayoffCall(如thePayoff变量)不是PayOffBridge,因此无法绑定到PayOffBridge的引用。

但是,可以通过转换PayOffBridge构造函数将其转换PayOffBridge

通过引用const参数,执行转换,生成一个绑定到形式参数的临时值。

const的引用通常可以绑定到临时。

对非const的普通引用不能绑定到临时。