C++ 编译器优化是否可以给出左值而不是右值?

C++ 编译器优化是否可以给出左值而不是右值?,c++,C++,以下代码: int x = 0; x+0 = 10; 毫不奇怪会产生编译器错误 lvalue required as left operand of assignment 但是,是否可以保证所有符合标准的编译器都会产生类似的错误,或者编译器可以合法地将第2行视为 x = 10; 然后哪个将被编译?是的,它保证您得到一个错误(或者更准确地说,一些诊断)。编译器优化永远不会使格式错误的代码格式正确。是的,编译器必须拒绝这种情况 有关价值类别的详细说明,请参见: 其中一个要点是,表达式的值类别

以下代码:

int x = 0;
x+0 = 10;
毫不奇怪会产生编译器错误

lvalue required as left operand of assignment
但是,是否可以保证所有符合标准的编译器都会产生类似的错误,或者编译器可以合法地将第2行视为

x = 10;

然后哪个将被编译?

是的,它保证您得到一个错误(或者更准确地说,一些诊断)。编译器优化永远不会使格式错误的代码格式正确。

是的,编译器必须拒绝这种情况

有关价值类别的详细说明,请参见:

其中一个要点是,表达式的值类别可以通过查看类型
decltype((expr))
来确定

编译器优化不会改变表达式的类型,它们通常发生在名称解析、类型确定、重载解析等之后


众所周知,Gcc会在前端执行一些不断的折叠,但如果任何版本的Gcc编译了您的示例,我都会感到震惊。

不允许优化来更改有效代码的含义,或语言规则。
x+0
的结果必须视为与
x
不同的对象,即使它们总是具有相同的值。无法将
x+0
解释为对
intx
的引用。您可以创建自己的类型,其中
T::operator+(int)
返回对自身的引用,如果您喜欢它(并且是邪恶的)。