C++右値参照と関数戻り値

1995 ワード

大学1年の时にmatrixで打った1つの问题で、谜のBUGが现れて、それから助教を教えてもらって、右の値の引用の问题です.
bool operator != (simple_iterator &a)
{
    return *pointer != *a.pointer;
} 
for (iter = ivec.Begin(); iter != ivec.End(); ++iter)
    cout << *iter;

エラーの場所はforループコンパイルエラーです.理由:C++の関数の非参照戻り値は右の値(一時オブジェクトは、等号の右側にのみ表示され、アドレスにアクセスできません)であり、C++11の前には右の値の参照はなく、C++11の後にはconst int&a=5などの右の値の参照が追加されます.しかし、上記のコードでは右の値の引用の文法規定(constが少なくなった)に合致しないため、コンパイルが間違って報告されるのは簡単です.
また、演算子の優先度と結合性(このブログを書くときに無理やり半日上の*a.pointerを見て理解できなかったので...)の優先度をまとめます.https://blog.csdn.net/lfb_2048/article/details/62040608上の例では(.)の優先度は(*)よりも大きいので、*a.pointerは*(a.pointer)に相当する.
結合性:優先度が同じ場合、結合性によって前後の実行順序が決定する、例えば、a=b=c、(=)の結合性は右から左、すなわちa=(b=c)に相当する.