You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:04:56