编译器优化是否可以给出左值而不是右值
Could a compiler optimisaton give an lvalue rather than rvalue?
以下代码:
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 编译您的示例,我会感到震惊。
相关文章:
- C++编译器是否优化了顺序静态变量读取?
- 现代C++编译器是否优化了对类中同一数据成员的重复访问?
- 编译器是否优化了默认移动构造函数?
- C++:编译器是否优化整数 + 浮点算术运算?
- C是否优化了循环的检查部分
- C++编译器是否优化重复的函数调用
- 编译器是否优化析构函数中的内存集
- 编译器是否优化了对常数变量的引用
- 编译器是否优化了语句"for"第二个条件?
- 编译器是否C++优化未使用的 #includes
- 按值返回堆栈上的变量是否优化为移动
- (gcc)编译器是否优化掉了空体函数
- GCC是否优化STD :: TIE仅用于可读性
- c++编译器是否优化a=b+c
- 现代编译器是否优化了for循环中使用的无符号int
- c++编译器是否优化了0*x
- 编译器是否C++优化按值返回的成员变量
- if(0) 和 if(1) 语句是否优化
- STL 映射容器在构造时是否优化(平衡树)
- 编译器是否优化了内联函数的局部变量