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

标签 c pointers casting lvalue

在发布了我最具争议的答案之一之后 here , 我敢问几个问题,最终填补了我知识上的一些空白。

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

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

最佳答案

一个更好的例子,一元 + 产生一个右值,x+0 也是如此。

根本原因是所有这些东西,包括你的 Actor ,都创造了新的值(value)。将一个值转换为它已经存在的类型,同样会创建一个新值,而不管指向不同类型的指针是否具有相同的表示形式。在某些情况下,新值恰好等于旧值,但原则上它是一个新值,不打算用作对旧对象的引用,这就是为什么它是右值。

要使这些成为左值,标准必须添加一些特殊情况,即某些操作在左值上使用时会导致对旧对象的引用,而不是新值。据我所知,对这些特殊情况的需求不大。

关于转换指针不会产生左值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446489/

相关文章:

c - K&R 编程练习 8

C指针数组

c - 指向变量的指针?

c++ - 为什么我没有收到字节数组中的数据?

c++ - 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?

c++ - 如何处理这些旧式类型转换?

c - 为什么 qsort 中的排序方法改变了我的数组?

c - 如果返回 NULL,则由 fgets 保证空终止

c - 功能指针,设计

java - 在非单例 bean 上的 Spring 代理上修复 BeanNotOfRequiredTypeException?