许多人可能会发现使用空指针访问静态类成员不会导致运行时是违反直觉的错误。本文深入探讨技术细节来解释此行为并讨论潜在的陷阱。
讨论的核心是空指针取消引用的评估。虽然通过未初始化的指针访问类成员通常是未定义的,但静态成员是一个例外。访问静态成员时,对象表达式(例如 d->a)本质上等同于 (*d).a。
在这种情况下,静态成员函数 fun 的参数是 d,它被计算但被丢弃。这是因为操作 *d 是一个被丢弃的值表达式,这意味着它仅针对其副作用进行评估(在本例中,没有副作用)。
问题的关键围绕通过空指针的间接寻址是否固有地导致未定义的行为。 C 标准在这个问题上提供了一些相互矛盾的指导。然而,一种广泛持有的解释是,仅通过空指针进行间接寻址,而不进行任何进一步的左值到右值转换或其他操作,不会调用未定义的行为。
在在 CWG-issue #232 的背景下,提出了“空左值”的概念来解决空指针取消引用的问题。然而,它从未被采用。
允许示例代码无错误执行的基本原理是,使用空指针调用静态成员函数不需要标识或对象的存储值。只需简单地访问静态成员的值,无需任何进一步的左值操作。
虽然通常允许使用空指针访问静态成员,但避免使用 .运算符访问非静态成员。非静态成员访问要求对象有效,这可能会导致使用空指针时出现未定义的行为。
以上是为什么使用空指针访问静态类成员可以工作?的详细内容。更多信息请关注PHP中文网其他相关文章!