Postfix增量运算符

Abh*_*nav 1 c++ visual-c++

我有一个自定义类MyInt,封装了一个int m_nValue数据.后缀运算符

MyInt operator++(int)  
{
  MyInt temp(*this);  
  ++(*this);  
  return temp; 
}
Run Code Online (Sandbox Code Playgroud)

如果运算符返回一个对象,那么为什么我不能多次调用postfix ++运算符,如:

MyInt value(10);
value++;    // valid
value++++;  // Why is this invalid?? Cant it be interpreted as (value++)++
Run Code Online (Sandbox Code Playgroud)

如果我可以调用MyInt类中定义的value.print()方法,为什么值++++会给出一个错误左值,那么我还应该能够做值+++?

Sha*_*baz 5

错误的答案:

因为value++是一个保存旧值的临时变量value.你不能++.

你也写不出来15++!它很相似.前者是临时变量,后者是常量,没有一个可以递增.

更正:由于这个答案被接受了,我不会改变原来的帖子,但是由于人们会阅读它,我会在这里发布更正.

首先,我不是说常量和临时对象是相同的概念.我只是试图说临时对象不是l值,就像常量不是,没有实际使用单词l-value.

关于value++++,这不是一个错误.我只是用我的g ++ 4.5测试它,它工作正常.在其他答案中,您可以阅读:

从2003年标准的3.10.10节:

为了修改对象,对象的左值是必要的,除了在某些情况下也可以使用类类型的右值来修改它的指示对象.[示例:调用对象(9.3)的成员函数可以修改对象.]

你正在做的事情本质上是错误的是:

让我们说value等等10.第一个value++更改value11但返回包含的临时对象10.然后你++将它更改临时值(你永远不会访问)11,但再次返回一个包含的临时对象10.所以value++++行为完全像value++除了做一些不必要的工作.

  • ***这不是正确答案.***你当然可以`+'用户定义类型的临时代码.`15 ++`是*类似的*,但只是语法上的.它与在UDT上调用`operator ++(0)`完全不同.关于UB的先前问题显示了[示例](http://stackoverflow.com/questions/4638364)的显着差异.这个问题显示了另一个差异的例子.一个常数和一个临时是完全不同的东西. (7认同)
  • 这实际上不正确.你可以在rvalues上调用成员函数就好了.gcc 4.3.4 [同意](http://ideone.com/OMYxr). (6认同)