我知道我们可以对内在数据类型应用递增和递减,例如:
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;
}
答案 0 :(得分:2)
此功能定义:
operator int&() { return value; }
允许从您的班级Foo
转换为对int。
这一行:
p++;
无法将p
增加为类型Foo
,因为该类未实现operator++
。但是,它可以通过调用int
将p转换为operator int&()
的引用,该value
会在Foo
的特定实例中返回对value
的引用。对int
的引用属于++
类型,可以使用value
递增。因此代码然后就地增加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()++;
}
。
至于返回in和int的引用之间的区别,以下代码显示您提到的行为与转换oeprator不同:
int
当转换运算符返回int&
而不是{{1}}时,无法进行增量的原因是增量运算需要左值,即可以作为赋值目标的值。有关详细信息,请参阅here。