C2x,6.5.3.2地址和间接操作符,语义,3:
一元&运算符产生其操作数的地址。如果操作数具有" type“类型,则结果具有”指向类型的指针“类型。如果操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两者都被省略了一样,但对运算符的约束仍然适用,并且结果不是lvalue。
如果对于&*x,*和&都没有计算,那么为什么*&x没有相同的规则呢?即一元*算子的相同规则。
发布于 2022-02-09 18:44:56
因为值可能会改变,所以引用不会。
int foo(volatile int x)
{
return *&x;
}
int *bar(volatile int *x)
{
return &*x;
}foo:
mov DWORD PTR [rsp-4], edi
mov eax, DWORD PTR [rsp-4]
ret
bar:
mov rax, rdi
ret有趣的是,将对此进行评估(仅限于&):
int *bar(int * volatile x)
{
return &*x;
}所以我之前的观点是无效的
发布于 2022-02-17 12:31:39
x和&*x之间的等价是由N721强制执行的,这使得一些以前具有UB定义的代码得到了很好的定义。
当x是一个有效的lvalue或一个函数(在C中不被认为是lvalue )时,*&x已经等价于x,而没有任何其他规则。编译器可能会以不同的方式对待它们,但他们可以自由地不这样做。
即使x是易失性限定的,&x也不执行易失性读取,只生成一个volatile T*类型的指针值(类型本身不易失性)。然后,它本身的间接不形成易失性访问,只使用结果,这与使用简单的x相同。
https://stackoverflow.com/questions/71054917
复制相似问题