转换指针不会产生左值.为什么?

Bla*_*iev 12 c pointers casting lvalue

发布我最有争议的一个回答后在这里,我不敢问几个问题,并最终在我的知识填补一些空白.

为什么不是一种((type_t *) x)被认为是有效左值的表达式,假设它x本身是指针和左值,而不仅仅是某个表达式?

我知道很多人会说"标准不允许它",但从逻辑的角度看它似乎是合理的.标准不允许的原因是什么?毕竟,任何两个指针都具有相同的大小,指针类型只是一个编译时抽象,指示在进行指针运算时应该应用的适当偏移量.

Jen*_*edt 8

演员的结果本身并不是左右.但是*((type_t *) x)是左值.


Ste*_*sop 7

一个更好的例子,一元+产生一个右值,就像这样x+0.

根本原因是所有这些事情,包括你的演员,都会创造一个新的价值.将值转换为它已经存在的类型,同样会创建一个新值,不管是指向不同类型的指针是否具有相同的表示形式.在某些情况下,新值恰好等于旧值,但原则上它是一个新值,它不打算用作旧对象的引用,这就是它为rvalue的原因.

对于这些是左值,标准必须添加一些特殊情况,当在左值上使用某些操作时会导致对旧对象的引用,而不是新值.AFAIK对这些特殊情况没有太大需求.