我有一些像这样的代码:
int a = 5;
Foo *foo = new Foo(MoreFoo(a),
Bar(a));
// Foo CTOR:
Foo(MoreFoo mf, Bar bar): MoreBar(&mf,bar){}
我的编译器给出了类型错误:
no matching function for call to ‘Bar::Bar(Bar)’
note: candidates are:
note: Bar::Bar(Bar&)
no known conversion for argument 1 from ‘Bar’ to ‘Bar&’
该错误显然与代码Bar(a)
有关。显然Bar
有适当的CTOR和CCTOR。我理解为什么编译器抱怨尝试调用像Bar::Bar(Bar)
这样的东西,我正在创建一个无名变量(Bar(a)
),它必须在调用Foo
构造函数时被复制,但是那不应该只是调用Bar
CCTOR吗?为什么我收到错误?
编辑:
为什么要调用Bar::Bar(Bar)
而不是Bar::Bar(Bar&)
?
答案 0 :(得分:2)
Temporaries不能绑定到引用,除非它们是对const
的引用。
答案 1 :(得分:2)
您似乎以下列方式声明了类Bar的复制构造函数
Bar( Bar & );
但你需要将其声明为
Bar( const Bar & );
如果要将临时对象用作参数,因为临时对象可能不会绑定到非const引用。