使用C++ preIncrement和postIncrement的奇怪经历

Par*_*era 3 c++ gcc g++

++a = b操作显示没有错误,但a++ = b在编译时显示错误g++.在这些操作之前初始化变量.

虽然这些操作没有实际用途,但我认为它们都应该在编译时发出相同的错误.你怎么看?如果有正当理由请向我解释.提前致谢!:)

PS gcc给出了这两个错误.

cad*_*ver 8

让我们看看前/后增量的声明如何(http://en.cppreference.com/w/cpp/language/operator_incdec):

++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);
Run Code Online (Sandbox Code Playgroud)

你得到了答案 - preInc返回引用,因此你可以使用"="运算符覆盖"a"变量.


Sin*_*all 6

结果if ++aLvalue,但结果a++Rvalue,你不能为Rvalue分配任何东西,因此错误.

不同之处在于(简化一点)Lvalue是一个引用某个对象的表达式,而Rvalue是指存储在某个内存中的数据.

让我们说结果a++7.基本上,当你写作时,a++ = b;你试图分配b7哪个显然是不可能的.++a = b;另一方面,当您编写时,增量的结果是引用的左值a,因此赋值将是有效的.

您可以在这里阅读更多关于左值右值的 信息.