2016-11-29 1 views
2

がなぜ正しい次のコードである:ここではアサイナブルr値

struct A 
{ 
    A operator+(A const& elem) 
    { 
    return *this; 
    } 

    bool operator==(A const& elem) 
    { 
    return true; 
    } 

    operator bool() 
    { 
    return true; 
    } 
}; 


int main() 
{ 
    A a_1, a_2; 

    if(((a_1+a_2) = a_1)) 
    {} 
} 

、私はa_1 + a_2ので、if文のエラーを期待r値です。クラスAため、(a_1+a_2) = a_1はちょうど最後のA::operator=(const A&)への呼び出しとして解析されますので

error: expression is not assignable 
     if(((a_1+a_2) = a_1)) 
      ~~~~~~~~~^
1 error generated. 
+0

*このような最小限の(しかしまだ完全な)例題にあなたの問題を減らすための誇大な名言。 –

答えて

1

int a_1, a_2;によってラインA a_1, a_2;を交換すると予想されるエラーにつながります。 a_1+a_2が返すものであっても、一時的なオブジェクトである場合でも、そのメンバ関数を呼び出しても有効です。

一時オブジェクトでこのような呼び出しを禁止する場合は、呼び出されたオブジェクトを区別するために使用できるref-qualified member functions(C++ 11以降)をl値またはr値として使用できます。例えば

struct A 
{ 
    //... 
    A& operator=(const A&) && = delete; // prevent from calling with temporary objects 
    A& operator=(const A&) & = default; 
}; 
+0

ヒント "ref-qualifiedメンバ関数"はとても良いです - ありがとう。 –