C++ 后缀增量运算符

C++ 后缀增量运算符,c++,visual-c++,C++,Visual C++,我有一个自定义类MyInt,它封装了一个int m\u值数据。后缀运算符 MyInt operator++(int) { MyInt temp(*this); ++(*this); return temp; } 如果运算符返回一个对象,那么为什么我不能多次调用postfix++运算符,如下所示: MyInt value(10); value++; // valid value++++; // Why is this invalid?? Cant it be i

我有一个自定义类MyInt,它封装了一个int m\u值数据。后缀运算符

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++)++
为什么value+++给出了一个错误levalue required
如果我可以调用MyInt类中定义的value.print()方法,那么我也应该能够执行value++?

错误答案:

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

你也不能写
15++
!这是相似的。前者是一个临时变量,后者是一个常量,所有变量都不能递增

更正:既然这个答案被接受了,我就不打算更改原来的帖子,但是因为人们会阅读它,我会在这里发布更正

首先,我不是说常量和临时对象是同一个概念。我只是想说临时对象不是l值,就像常量不是一样,没有实际使用l值这个词

关于
值+++
,这不是一个错误。我刚刚用我的g++4.5测试了它,效果很好。在其他答案中,您可以阅读:

根据2003年标准第3.10.10节:

为了修改对象,对象的左值是必需的,但类类型的右值在某些情况下也可用于修改其引用。[示例:为对象(9.3)调用的成员函数可以修改该对象。]

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


假设
value
保持
10
。第一个
value++
value
更改为
11
,但返回一个包含
10
的临时对象。然后,您将
++
它将临时值(您从未访问)更改为
11
,但再次返回包含
10
的临时对象。因此
value++++
的行为与
value++
完全相同,只是它做了一些不必要的工作。

错误答案:

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

你也不能写
15++
!这是相似的。前者是一个临时变量,后者是一个常量,所有变量都不能递增

更正:既然这个答案被接受了,我就不打算更改原来的帖子,但是因为人们会阅读它,我会在这里发布更正

首先,我不是说常量和临时对象是同一个概念。我只是想说临时对象不是l值,就像常量不是一样,没有实际使用l值这个词

关于
值+++
,这不是一个错误。我刚刚用我的g++4.5测试了它,效果很好。在其他答案中,您可以阅读:

根据2003年标准第3.10.10节:

为了修改对象,对象的左值是必需的,但类类型的右值在某些情况下也可用于修改其引用。[示例:为对象(9.3)调用的成员函数可以修改该对象。]

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

假设
value
保持
10
。第一个
value++
value
更改为
11
,但返回一个包含
10
的临时对象。然后,您将
++
它将临时值(您从未访问)更改为
11
,但再次返回包含
10
的临时对象。因此
value++++
的行为与
value++
完全相同,只是它做了一些不必要的工作。

实际上,这:

#包括
结构MyInt{
MyInt():值(0){}
MyInt&运算符++(){
实际上,这是:

#包括
结构MyInt{
MyInt():值(0){}
MyInt&运算符++(){


std::cout With
int x
x++
也会返回一个
int
;)@delnan是的,我也尝试过。但是由于我可以对返回值调用方法,我想我可以像使用方法一样再次使用a++了。后缀运算符的不同之处在于,我可以对返回值调用方法,但我不能使用更多的后缀+han once?我想真正的问题是为什么后缀增量需要一个左值…@KerrekSB是的,这个问题也可以这样解释。为什么post和pre的行为不同?这看起来像是一个编译器错误。你使用的是什么版本?对于
int x
x++
也会返回一个
int
;)@delnan是的,我试过t这也是。但由于我可以对返回值调用方法,我想我可以像使用方法一样再次使用a++了。是什么让后缀运算符不同,我可以对返回值调用方法,但我不能多次使用后缀+?我想真正的问题是为什么后缀增量需要左值…@KerrekSB是的问题c也可以这样解释。为什么post和pre的行为不同?这看起来像是一个编译器错误。你使用的是什么版本?我在想象一个世界,人们会写value++++++++++++++。恐怖!是的,因为当你写
++value
时,你会更改变量
value
本身,并返回对它的引用。然后,它就变了它不是一个临时变量。如果不返回引用,
+++value
也是不可能的。这实际上是不正确的。你可以在右值上调用成员函数。gcc 4.3.4。@Kdansky可能是简写符号,或者实用运算符对你来说很可怕。你可能使用它们很糟糕,或者你的美感很差e、 但对许多人来说,这是一种美。这不是正确的答案。你当然可以
++
用户定义类型的临时表。
15++
类似,但只有synt
#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;
}