关于课堂上c ++参考的困惑

时间:2013-02-22 10:32:31

标签: c++

以下代码是正确的

    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

1 个答案:

答案 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的相应赋值运算符,会导致模糊或从默认赋值运算符中删除或无法访问的函数,或者
  •   
  • 用于移动赋值运算符,非静态数据成员或直接基类,其类型不具有移动赋值运算符且不可轻易复制,或任何直接或间接虚拟基类。
  •