C++ 复制构造函数接受常量引用的行为

C++ 复制构造函数接受常量引用的行为,c++,copy-constructor,C++,Copy Constructor,在下面的代码中,在这一行中 A(A&b) 使用此编译器时,错误如下所示 c110.cpp:41:错误:调用“A::A(A)”时没有匹配的函数 c110.cpp:8:注:候选人为:A::A(A&) 但只要我把它转换成 A(施工A&b) 提前很多次 没有错误。为什么会这样 Code class A { public: static int cnt; A(A& b) { cnt++; cout<<"cnt="<&l

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

A(A&b)

使用此编译器时,错误如下所示

c110.cpp:41:错误:调用“A::A(A)”时没有匹配的函数

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;
 }
code
甲级
{
公众:
静态int-cnt;
A(A&b)
{
cnt++;

cout非
const
引用无法绑定到临时变量。如果将临时变量作为参数传递,
a&
是非法的,但
const a&
不是

线路

A b=fun(a);
fun(a)
返回的对象执行复制初始化,该对象是临时的


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

常量
引用无法绑定到临时引用。如果您将临时作为参数传递,
a&
是非法的,但
常量a&
不是

线路

A b=fun(a);
fun(a)
返回的对象执行复制初始化,该对象是临时的


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

我认为在复制构造中使用(常量a&)类型的语法而不是(a&)类型的语法总是安全的,因为RVO可能发生或不发生,它取决于编译器


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

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


如上述问题RVO不发生,临时创建,因此(const a &)是安全使用的。< /p>但是在C++函数中,而不是在返回值时创建临时值,传递B的地址,并且在函数内用B变量复制它,我认为它是RVO(返回值优化)。,它不会在这里发生吗???@Luv它可以而且可能会发生。但这并不重要。仅仅因为它没有使用某些东西并不意味着它不需要正确定义。不清楚,RVO优化是否在这里发生?我想没有其他原因为什么会出现临时性的情况created@Luv我是说优化不会影响pr的有效性如果复制构造函数或任何必须可见的对象,它必须是可见的,不管它是否被调用。但是在C++函数中,而不是在返回值时创建临时值,传递B的地址,并且在函数内用B变量构造副本,我认为它是RVO(返回值优化)。,它不会在这里发生吗???@Luv它可以而且可能会发生。但这并不重要。仅仅因为它没有使用某些东西并不意味着它不需要正确定义。不清楚,RVO优化是否在这里发生?我想没有其他原因为什么会出现临时性的情况created@Luv我是说优化不会影响pr的有效性gram。如果复制构造函数或任何东西必须是可见的,那么它必须是可见的,无论它是否被调用。RVO是否发生都无关紧要。与其他优化一样,它永远不会影响程序的有效性,无论编译器如何。RVO是否发生也无关紧要。与其他优化一样,它永远不会影响e程序的有效性,与编译器无关。