18

効果的な C++ の項目 3 で、Scott Meyers は次operator*の名前のクラスのオーバーロードを提案していRationalます。

    class Rational { ... };
    const Rational operator*(const Rational& lhs, const Rational& rhs);

戻り値がconst修飾されている理由は、次の行で説明されています。修飾されていない場合const、プログラマは次のようなコードを記述できます。

    (a * b) = c;

または、おそらく:

     if (a*b = c)

けっこうだ。関数の戻り値、ここでは operator* は右辺値であり、割り当て可能ではないと思ったので、今は混乱しています。私が持っていた場合:

    int foo();
    foo() += 3;

でコンパイルに失敗しますinvalid lvalue in assignment。なぜここでそれが起こらないのですか?誰かがこれに光を当てることができますか?

EDIT : Scott Meyers のまさに Item に関する他の多くのスレッドを見てきましたが、ここで公開した右辺値の問題に取り組むものはありませんでした。

4

1 に答える 1

30

ポイントは、クラス型の場合、はメンバー関数a = bの省略形に過ぎないということです。また、メンバー関数は右辺値で呼び出すことができます。a.operator=(b)operator=

operator=C++11 では、左辺値のみにすることでそれを禁止できることに注意してください。

class Rational
{
public:
  Rational& operator=(Rational const& other) &;
  // ...
};

は、この&関数が右辺値で呼び出されない可能性があることをコンパイラに伝えます。

于 2012-01-12T09:01:18.317 に答える