C++26中((struct s*)0)->x的x值类别及代码是否存在未定义行为
关于C++中
((struct s*)0)->x的值类别与未定义行为分析 先看这段代码:
struct s { int x; int y[sizeof((struct s*)0)->x]; };
编译时的差异:
- GCC按C++26标准编译(命令:
g++ -std=c++26 -pedantic -Wall -Wextra)无报错 - Clang编译会抛出错误:
error: member access into incomplete type 'struct s'
一、((struct s*)0)->x中x的值类别
假设GCC的行为符合标准,结合C++标准expr.ref章节的7.2条款,这里的x属于xvalue(亡值)。
通常->运算符的结果多为左值,但当访问的是非静态数据成员,且指针表达式是空指针常量转换而来的指针时,成员访问的结果不再是左值——因为此时并没有指向实际存在的对象,无法满足左值需关联实际存储的要求。这种情况下,表达式结果是xvalue(属于右值的一种),仅用于传递成员的类型信息,不会触发实际内存访问。
二、这段代码是否存在未定义行为?
不存在未定义行为。
核心原因是sizeof运算符是编译期计算的,它不会执行传入的表达式,仅分析表达式的类型来获取大小。这里的((struct s*)0)->x只是用来推导成员x的类型(int),并没有实际解引用空指针的操作——没有访问任何内存地址,因此不会触发未定义行为。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

