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

Could a compiler optimisaton give an lvalue rather than rvalue?

本文关键字:是否 优化 编译器      更新时间:2023-10-16

以下代码:

int x = 0;
x+0 = 10;

不出所料,会产生编译器错误

lvalue required as left operand of assignment

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

x = 10;

然后哪个会编译?

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

是的,编译器必须拒绝这一点。

可以在此处找到对值类别的良好描述:https://medium.com/@barryrevzin/value-categories-in-c-17-f56ae54bccbe

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

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

众所周知,GCC 会在前端执行一些恒定的折叠,但如果任何版本的 gcc 编译您的示例,我会感到震惊。