复制构造函数可以有一个非常量左值参数吗?

Can a copy constructor have a non-const lvalue parameter?

class Complex{
    int x,y;
    
    public:
    
    void setdata(int x,int y)
    {
        this->x=x;this->y=y;
    }
    Complex add(Complex &c)
    {
        Complex temp;
        temp.x=this->x + c.x;
        temp.y=this->y + c.y;
        return temp; 
    }
    Complex(Complex &c) // copy constructor
    {
        x=c.x; y=c.y;
    }
    Complex() // Simple default constructor
    {

    }
    void showdata()
    {cout<< this->x <<" "<< this->y;}
};

int main()
{
    Complex c1; c1.setdata(3,4);
    Complex c2=c1; 
    Complex c3 = c1.add(c2);
    //c3.showdata();
    cout<<"\n"<<Complex::v;
    return 0;
}

Complex c2=c1; 这对编译器来说没问题。 而 Complex c3 = c1.add(c2); 会产生错误,即:

这是否与临时变量被销毁后内存被释放有关,还是其他原因,因为我无法理解上述编译器规定的错误?

问题add成员函数returns一个右值表达式类型Complex 并且您正在尝试将 非常量左值引用 Complex& 绑定到 rvalue.

您可以 解决 这个错误,方法是将 Complex(Complex &c) 替换为:

Complex(const Complex &c) //const added here

注意上面语句中添加的const。现在,复制构造函数的参数是对 const Complex 的 引用,它可以绑定到 rvalue.

标题问题的答案是:是的,copy-constructor可以有一个non-const参数。来自 C++20 draft

11.4.4.2 Copy/move constructors [class.copy.ctor]

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments