在以下代码中,在此行中
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;
}
答案 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;)可以安全使用。