我有一个自定义类MyInt,封装了一个 int m_nValue 数据。后缀运算符
MyInt operator++(int)
{
MyInt temp(*this);
++(*this);
return temp;
}
如果运算符返回一个对象,那么为什么我不能多次调用postfix ++运算符:
MyInt value(10);
value++; // valid
value++++; // Why is this invalid?? Cant it be interpreted as (value++)++
为什么值++++会出现错误 lvalue required 如果我可以调用MyInt类中定义的value.print()方法,那么我还应该能够做值+++吗?
答案 0 :(得分:5)
错误回答:
因为 value++
是一个临时变量,它保存旧值value
。你不能++
它。
你也写不出 15++
!它很相似。前者是一个临时变量,后者是一个常量,没有一个可以递增。
更正:由于此答案已被接受,我不打算更改原帖,但由于人们会阅读,我会在此处发布更正。
首先,我并不是说常量和临时对象是相同的概念。我只是试图说临时对象不是l值,就像常量不是,没有实际使用单词l-value。
关于value++++
,这不是错误。我只是用我的g ++ 4.5测试它,它工作正常。在其他答案中,您可以阅读:
2003年标准第3.10.10节:
对象的左值是必要的,以便修改对象,除了在某些情况下也可以使用类类型的右值来修改其指示对象。 [示例:调用对象(9.3)的成员函数可以修改对象。 ]
你正在做的事情本身就是错误的:
假设value
成立10
。第一个value++
将value
更改为11
,但会返回包含10
的临时对象。然后你++
它将临时值(你永远不会访问)更改为11
,但是再次返回一个包含10
的临时对象。所以value++++
的行为与value++
完全相同,只是它做了一些不必要的工作。
答案 1 :(得分:4)
实际上,这是should work:
#include <iostream>
struct MyInt {
MyInt() : value(0) {}
MyInt& operator++() {
std::cout << "Inside MyInt::operator++()" << std::endl;
++value;
return *this;
}
MyInt operator++(int)
{
MyInt temp(*this);
++(*this);
return temp;
}
int value;
};
int main() {
MyInt mi;
std::cout << "Value before: " << mi.value << std::endl;
mi++++;
std::cout << "Value after: " << mi.value << std::endl;
}
此运算符基本上只是一个具有花哨语法的普通成员函数,因此您可以在右值上调用它。请注意,正如Martinho在他的评论中解释的那样,效果不是理想的,因为第二个增量是临时的。
2003年标准第3.10.10节:
为了修改对象,必须使用对象的左值 除了类型的右值也可以用来修改它 在某些情况下指称。 [示例:成员函数 调用对象(9.3)可以修改对象。 ] 强>