我不明白为什么以下代码不起作用:
#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引用,有人可以帮我解决这个问题吗?
谢谢!
答案 0 :(得分:3)
原始代码不起作用,因为thePayOff
不是PayOffBridge
类型的值,而是类型PayOffCall
。
修改后的代码有效,因为它允许从PayOffBridge
对象的PayOff
子对象构造临时PayOffCall
对象,然后从中构造VanillaOption
对象临时。那是因为:
PayOffBridge
构造函数是非显式的,换句话说,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
的普通引用不能绑定到临时。