以下代码:
int x = 0;
x+0 = 10;
毫不奇怪地产生编译器错误
lvalue required as left operand of assignment
但是,保证是否所有符合标准的编译器都会产生类似的错误,或者编译器可以合理地将第2行视为
x = 10;
然后编译?
答案 0 :(得分:5)
是的,确保您收到错误(或更确切地说,某些诊断)。编译器优化永远不会使格式错误的代码形成良好。
答案 1 :(得分:1)
是的,编制者必须拒绝这一点。
可以在此处找到价值类别的良好描述: https://medium.com/@barryrevzin/value-categories-in-c-17-f56ae54bccbe
其中一个要点是,表达式的值类别可以通过查看类型decltype ((expr))
来确定。
编译器优化不会改变表达式的类型,它们通常在名称解析,类型确定,重载决策等之后发生。
众所周知,Gcc会在前端执行一些常量折叠,但如果任何版本的gcc编译你的例子,我会感到震惊。