复制构造函数接受const引用的行为

时间:2012-07-04 11:08:07

标签: c++ copy-constructor

在以下代码中,在此行中

  

A(A& b)

使用此编译器时会出现错误

c110.cpp:41:错误:没有匹配函数来调用'A :: A(A)'

c110.cpp:8:注意:候选人是:A :: A(A&)

但是一旦我将其转换为

  

A(const A& b)

提前许多不足

没有错误。为什么会这样?

Code
class A
{
    public: 
    static int cnt;
    A(A& b)
    {
       cnt++;
       cout<<"cnt="<<cnt<<endl;
    }
    A()
    {
       cnt++;
       cout<<"cnt="<<cnt<<endl;
    }
    ~A()
    {
       cnt--;
       cout<<"cnt="<<cnt<<endl;
    }
};



  int A :: cnt=0;


  A fun(A b)
  {
  return b;
  }


 int main()
 {
     A a;
     A b=fun(a);
     return 0;
 }

2 个答案:

答案 0 :(得分:10)

const引用无法绑定到临时对象。如果您传递临时参数,A&是非法的,但const A&不是。

该行

A b=fun(a);

fun(a)返回的对象进行复制初始化,这是一个临时的。

此外,复制构造函数不应采用非const引用,因为从逻辑上讲,您不需要修改要复制的对象。

答案 1 :(得分:0)

我认为使用A(const A&amp;)类型的语法进行复制构建而不是A(A&amp;)总是安全的,因为RVO可能发生或不发生,它依赖于编译器。

如上所述,RVO没有发生并且临时已经创建,因此A(const A&amp;)可以安全使用。