0

次のような固有のデータ型にインクリメントとデクリメントを適用できることを理解しています。

int a;

a++;
a--;

...等。

ただし、次のコードで&は、行のを省略するoperator int& ( ) { return value; }と、コンパイルエラーが発生します。&ここで、使用によって増分が可能になる方法と理由を説明してください。

#include <iostream>

class Foo {

public:
   int value;
   operator int& ( ) { return value; }

};


int main ( ) {
    Foo p;
    p.value = 10;

    p++;

    std::cout << p <<  std::endl;

    std::cin.get ( );
    return 0;
}
4

1 に答える 1

2

この関数の定義:

operator int&() { return value; }

Fooクラスからintへの参照への変換を許可します。

この行:

p++;

クラスが実装されていないため、p型としてインクリメントできません。ただし、の特定のインスタンス内でへの参照を返す呼び出しを介して、pをへの参照に変換することはできます。への参照は、を使用してインクリメントできるタイプです。そのため、コードはインプレースでインクリメントされます。Foooperator++intoperator int&()valueFoovalueint++value

inを返すこととintへの参照を返すことの違いに関して、次のコードは、あなたが言及した動作が変換演算子と区別されないことを示しています。

class Foo
{
public:
    Foo() : m_value(0)
    {
    }

    int getCopy() { return m_value; }
    int& getRef() { return m_value; }
private:
    int m_value;
};

int main()
{
    Foo f;

    // Works
    f.getRef()++;

    // Does not work on g++ with 'error: lvalue required as increment operand`
    f.getCopy()++;
}

変換演算子が戻ったときにインクリメントを実行できない理由は、インクリメント操作には左辺値、つまり代入のターゲットになる可能性のあるものが必要なためですintint&詳細については、こちらをご覧ください。

于 2012-07-07T19:39:00.920 に答える