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

Luv*_*Luv 1 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;
 }
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 10

const引用不能绑定临时对象.如果传递临时参数,A&则是非法的但const A&不是.

这条线

A b=fun(a);
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Luv它可以而且可能会.但没关系.仅仅因为它没有使用某些东西并不意味着它不必被正确定义. (2认同)