1

在下面的代码中,在这一行

A(A&B)

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

c110.cpp:41: 错误:没有匹配函数调用'A::A(A)'</p>

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

但是一旦我把它转换成

A(常量 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;
 }
4

2 回答 2

10

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

线

A b=fun(a);

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

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

于 2012-07-04T11:09:18.787 回答
0

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

正如上面的问题 RVO 没有发生并且临时被创建,因此 A(const A&) 可以安全使用。

于 2012-07-04T11:31:47.080 回答