Postfix增量运算符

时间:2011-10-18 12:48:01

标签: c++ visual-c++

我有一个自定义类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()方法,那么我还应该能够做值+++吗?

2 个答案:

答案 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)可以修改对象。 ]