复制构造函数可以有一个非常量左值参数吗?
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);
会产生错误,即:
- class
Complex
没有合适的复制构造函数。
- 无法将
Complex &
类型的非常量左值引用绑定到 Complex
. 类型的右值
这是否与临时变量被销毁后内存被释放有关,还是其他原因,因为我无法理解上述编译器规定的错误?
问题是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
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);
会产生错误,即:
- class
Complex
没有合适的复制构造函数。 - 无法将
Complex &
类型的非常量左值引用绑定到Complex
. 类型的右值
这是否与临时变量被销毁后内存被释放有关,还是其他原因,因为我无法理解上述编译器规定的错误?
问题是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