以下代码是正确的
string s1="abc";
string s2="bcd";
string &rs1=s1;
string &rs2=s2;
rs1=rs2;
cout<<rs1<<"----"<<rs2<<endl;
以下代码将编译错误:
class A
{
public:
A(string& a):ma(a) { }
string& ma;
};
string s1="abc";
string s2="bcd";
A oa(s1);
A ob(s2);
oa=ob;
cout<<oa.ma<<"----"<<ob.ma<<endl;
以上都是string&
类型赋值,为什么把它们放到类中会导致编译错误?
(gcc版本4.7.1)
错误信息
non-static reference member 'std::string& A::ma', can't use default assignment operator
答案 0 :(得分:1)
您正在设置对本地临时变量的成员引用。构造函数中的参数是temp)。这导致了“悬空参考”,这是不好的。
将参数更改为引用,或将您的成员更改为非引用。出于您的目的,您可能需要:
class A
{
public:
A(string& a):ma(a) { }
A& operator =(const A& other)
{
ma = other.ma;
return *this;
}
string& ma;
};
但是你应该知道,你班级的默认复制构造函数可能不会按照你的想法去做。
<强>更新强>
标准的特定区域,处理当类具有引用成员时删除默认复制赋值运算符的原因:
C ++11§12.8,p23
如果X具有以下内容,则类X的默认复制/移动赋值运算符被定义为已删除: - 具有非平凡对应赋值运算符的变量成员,X是类似联合的类,或
- const非类类型(或其数组)的非静态数据成员,或
- 参考类型的非静态数据成员或
- 类型M(或其数组)的非静态数据成员,由于应用于M的相应赋值运算符的重载决策(13.3),无法复制/移动,导致模糊或删除的函数或默认分配操作员无法访问,或
- 无法复制/移动的直接或虚拟基类B,因为重载解析(13.3),如应用于B的相应赋值运算符,会导致模糊或从默认赋值运算符中删除或无法访问的函数,或者
- 用于移动赋值运算符,非静态数据成员或直接基类,其类型不具有移动赋值运算符且不可轻易复制,或任何直接或间接虚拟基类。