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&型の割り当てですが、なぜそれらをクラスに入れるとコンパイルエラーが発生するのでしょうか? (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 が次の場合に削除済みとして定義されます。

  • const 非クラス型 (またはその配列) の非静的データ メンバー、または
  • 参照型の非静的データ メンバー、または
  • オーバーロードの解決 (13.3) が M の対応する代入演算子に適用されるため、コピー/移動できないクラス型 M (またはその配列) の非静的データ メンバー。デフォルトの代入演算子、または
  • オーバーロード解決 (13.3) が B の対応する代入演算子に適用されるため、コピー/移動できない直接または仮想基本クラス B
  • 移動代入演算子の場合、移動代入演算子を持たず自明にコピーできない型を持つ非静的データ メンバーまたは直接基底クラス、または直接または間接の仮想基底クラス。
于 2013-02-22T10:34:48.017 に答える