没有按预期调用复制构造函数

时间:2014-04-16 13:44:44

标签: c++ constructor copy-constructor

我有一些像这样的代码:

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&)

2 个答案:

答案 0 :(得分:2)

Temporaries不能绑定到引用,除非它们是对const的引用。

答案 1 :(得分:2)

您似乎以下列方式声明了类Bar的复制构造函数

Bar( Bar & );

但你需要将其声明为

Bar( const Bar & );

如果要将临时对象用作参数,因为临时对象可能不会绑定到非const引用。