0

以下代码是正确的

    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&类型赋值,为什么放到class里面会导致编译错误呢?(gcc 版本 4.7.1 )

错误信息是

non-static reference member 'std::string& A::ma', can't use default assignment operator
4

1 回答 1

1

您正在设置对本地临时变量的成员引用。构造函数中的参数是临时的)。这导致了“悬空引用”,这是不好的。

将参数更改为引用,或将您的成员更改为非引用。出于您的目的,您可能需要:

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(或其数组)的非静态数据成员,因为重载决议 (13.3) 应用于 M 的相应赋值运算符会导致歧义或函数从默认赋值运算符,或
  • 无法复制/移动的直接或虚拟基类 B,因为应用于 B 的相应赋值运算符的重载解析 (13.3) 会导致歧义或从默认赋值运算符中删除或无法访问的函数,或
  • 对于移动赋值运算符,非静态数据成员或直接基类,其类型不具有移动赋值运算符且不可平凡复制,或任何直接或间接虚拟基类。
于 2013-02-22T10:34:48.017 回答