没有调用复制构造函数

Ram*_*dhi 10 c++

考虑给定的代码

struct ABC
{
    ABC()
    {
        std::cout<<" Calling from default constructor";
    }

    ABC(const ABC &copy)
    {
        std::cout<<"Calling from copy constructor";
    }
};

int main()
{
    ABC abc = ABC();
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题


Q1)从复制构造函数参数声明中删除const会产生错误.为什么?

Q2)添加const关键字后,我没有看到对复制构造函数的调用.为什么?复制构造函数没有被调用,为什么const是必要的?


TIA

ybu*_*ill 5

  1. 你需要const,因为你试图用一个临时的ABC()来初始化abc.因此,如果构造函数不是const,则编译器必须拒绝该代码.

  2. 在使它成为const之后,代码是标准的抱怨,编译器可以编译它.但是,如本标准所述,允许在这种情况下优化副本,因此它会删除对复制构造函数的调用.

  • 您错误地认为是默认的复制构造函数:"类`X`的非模板构造函数是一个复制构造函数,如果它的第一个参数是`X&`,`const X&`,`volatile X&`或`const volatile X&` ,并且没有其他参数或者所有其他参数都有默认参数" (2认同)
  • 如果代码为您编译,那么您可能正在使用VC++,它允许将临时绑定绑定到非const引用作为非标准扩展.就语言规范而言,使用此代码发现错误的编译器是正确的. (2认同)
  • 暂时的`ABC()`是*不是*const.这是暂时的.仅这就回答了第一个问题.在C++中,将非const引用绑定到temporaries是违法的. (2认同)