3

次のプログラムをコンパイルしようとすると、意味のある左辺値でエラーが発生します。エラー: エラー C2106: '=': 左オペランドは左辺値でなければなりません

コード:

int main() 
{
    int a,b,c,d;
    b+c=d;
    return 0;
 }

しかし、整数を独自の構造に置き換えると、次のコードはまったく問題なく動作します

struct MyStruct
{
    int val;
    MyStruct(){}
};

MyStruct operator+(MyStruct& s1, MyStruct& s2)
{
    MyStruct temp;
    return temp;
}

int main() 
{

    MyStruct a,b,c,d;
    b+c=d;
    return 0;
}

2 番目のコードがコンパイルされるのはなぜですか? operator+ から const を返すことができることはわかっています。しかし、2 番目の例の b+c は右辺値ではありませんか? では、なぜそれがコンパイルされるのですか

4

2 に答える 2

2

コードがコンパイルされる理由については、 Cory Kleinが既に説明しています。

s (およびその他の組み込み型)MyStructとして動作する場合は、次の行を に追加します。intMyStruct

MyStruct& operator =(const MyStruct&) && = delete;

operator =()これは、右辺値であるオブジェクトで が呼び出されるたびに ( ref-qualifierMyStructのおかげで)が存在しないため、コードが有効であってはならないことをコンパイラに伝えます ( )。実際、GCC 4.8.1 は次のメッセージを出力します。 &&operator =()= delete;

エラー: 削除された関数 'MyStruct& MyStruct::operator=(const MyStruct&) &&' の使用

b+c=d;
   ^

更新: Caseyのコメントに従います (どうもありがとうございました)。

上記の行を に追加する際に 1 つの問題がありMyStructます。また、左辺値への割り当ても防ぎます。つまり、以下の行も不正になります。

b = c;

右辺値への代入を無効にしたいが、左辺値への代入を引き続き許可する場合は、上記の行の代わりに、次の行を に追加しMyStructます。

MyStruct& operator =(const MyStruct&) & = default;

(または、コンパイラが生成した実装が目的に合わない場合は、正しい実装を提供してください。)

于 2013-07-19T18:23:54.397 に答える