C++ 为什么右值在C++;非法的?

C++ 为什么右值在C++;非法的?,c++,increment,rvalue,C++,Increment,Rvalue,右值递增有什么问题?有没有令人信服的答案,为什么这段代码在C++中是非法的: int f(int x) {return x + 1;} int main() { std::cout << ++f(2) << '\n'; return 0; } intf(intx){返回x+1;} int main(){ std::cout根据增量运算符: 内置前缀递增或递减运算符的操作数expr必须是可修改的(非常量)非布尔算术类型的左值或指向完整对象类型的指针。对于非布尔操作

右值递增有什么问题?有没有令人信服的答案,为什么这段代码在C++中是非法的:

int f(int x) {return x + 1;}
int main() {
  std::cout << ++f(2) << '\n';
  return 0;
}
intf(intx){返回x+1;}
int main(){
std::cout根据增量运算符:

内置前缀递增或递减运算符的操作数expr必须是可修改的(非常量)非布尔算术类型的左值或指向完整对象类型的指针。对于非布尔操作数,表达式++x完全等效于x+=1,表达式--x完全等效于x-=1,也就是说,前缀递增或递减是标识修改操作数的左值表达式

从中,
++f(2)
转换为
f(2)=f(2)+1
,但没有用于存储RHS结果的LHS。这需要使用
左值。

根据for递增运算符:

内置前缀递增或递减运算符的操作数expr必须是可修改的(非常量)非布尔算术类型的左值或指向完整对象类型的指针。对于非布尔操作数,表达式++x完全等效于x+=1,表达式--x完全等效于x-=1,也就是说,前缀递增或递减是标识修改操作数的左值表达式


从中,
++f(2)
转换为
f(2)=f(2)+1
,但是没有LHS来存储RHS的结果。
左值
是需要的。

在奶牛回家之前,我们可以猜测它的荒谬或其他,但简单的回答是,你不能这样做,因为没有人说服标准委员会它可能有用。也许你可以

在某些情况下,这样的代码利用重载运算符(例如Boost Spirit),它确实是有用的

反对引入它的一个理由是编译器的复杂性

作为对您有利的最后一个论点,请注意

int n = 0; ++++n;

是有效的C++,但<>强>不>强>有效C,因为在后一种情况下,代码> ++n>代码>不是LVal.你在某种意义上说,沿着进化路径,C++从C.</P> < P>进化,我们可以推测它的荒谬性,否则,直到母牛回家,但简短的答案是,你真的不能这么做了。没有人让标准委员会相信它会有用。也许你可以

在某些情况下,这样的代码利用重载运算符(例如Boost Spirit),它确实是有用的

反对引入它的一个理由是编译器的复杂性

作为对您有利的最后一个论点,请注意

int n = 0; ++++n;


是有效的C++,但<>强>不>强>有效C,因为在后一种情况下,代码> ++n>代码>不是LVal.你在某种意义上说,沿着进化路径,在C++从C.</P>演变的时候,你会喜欢它,即使在明显错误的情况下也可以允许它吗?因为RouValk在某种程度上不存在,EY只是暂时的,而 ++//>运算符(前缀和后缀)需要在某个地方写增量结果,而不能在不存在的东西上做。因为C++规范(例如)禁止。我不确定理解语言中每个特性的动机是否有意义。凭直觉,你只能增加一个“位置”,而

f(2)
不是(它只是一个
int
,你不能增加3,例如
+3
没有意义)@有些程序员的右值是表达式;表达式存在。值和临时对象也存在。如果
f
的类类型不太令人信服,则可以执行
++f(2)
explanation@M.M:在问题中,
f
被定义为
intf(intx){returnx+1;}
因此没有类类型即使在明显错误的情况下,您是否希望始终允许它?因为从某种意义上说,右值并不存在,它们只是临时的。还有
+
运算符(前缀和后缀)需要在某个地方写增量结果,而不能在不存在的东西上做。因为C++规范(例如)禁止它。我不知道理解语言中的每一个特征的动机是否有意义。直观地,只能增加一个“位置”,<代码> f(2)< /C> >(它只是一个
int
,不能增加3,例如
++3
没有意义)@Someprogrammerdude右值是表达式;表达式存在。值和临时对象也存在。您可以执行
++f(2)
if
f
具有类类型,因此这不是一个令人信服的结论explanation@M.M:在问题中,
f
被定义为
intf(intx){returnx+1;}所以第一段没有一个类的投票,但是最后一个不是很有说服力。C++编译器已经开始对吃我们的猫起了巨大的作用。这不会让它们更糟。@ StyteleLe:你是说+++第二段?@故事作者:哦,我已经再次废止了你的评论;@说书人:可能会让他们远离可疑的投票圈……关于说服委员会的可能性,我想说一件事。任何这样的讨论都可能如下:OP:“我们可以改写为允许
++f(2)
”。委员会:“你到底为什么不能接受
f(2)+1
?拒绝。下一期”我对第一段的评价很高。但是最后一个并不太有说服力。C++编译器已经开始对我们的猫吃了一大堆的巨兽了。这不会让它们更糟。@ StyteleL:你是指+++的第二段?@故事作者:哦,我已经再次废止了你的评论;-斯图里特勒:可能会让他们远离可疑的投票环……关于说服委员会的可能性,我们将说一件事。任何这样的讨论都可能如下:OP:“我们可以改写为允许
++f(2)