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

时间:2017-11-03 14:47:54

标签: c++

以下代码:

int x = 0;
x+0 = 10;

毫不奇怪地产生编译器错误

lvalue required as left operand of assignment

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

x = 10;

然后编译?

2 个答案:

答案 0 :(得分:5)

是的,确保您收到错误(或更确切地说,某些诊断)。编译器优化永远不会使格式错误的代码形成良好。

答案 1 :(得分:1)

是的,编制者必须拒绝这一点。

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

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

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

众所周知,Gcc会在前端执行一些常量折叠,但如果任何版本的gcc编译你的例子,我会感到震惊。