0

我知道我们可以对内在数据类型应用递增和递减,例如:

int a;

a++;
a--;

...ETC。

但是,在下面的代码中,如果我&在行中省略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()++;
}

int当转换运算符返回而不是增量操作时,您不能执行增量的原因int&是增量操作需要一个左值,即可以作为赋值目标的东西。有关更多详细信息,请参见此处

于 2012-07-07T19:39:00.920 回答