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

C++ standard layout类reinterpret_cast首成员的标准依据与别名规则疑问

C++标准中标准布局类与首成员指针转换的对应条款

cppreference的这段表述完全有明确标准依据,和严格别名规则不存在实际冲突,C++11及之后所有正式版本的标准中相关规则逻辑一致,仅条款编号随版本迭代有微调,具体对应内容如下:

  • 双向转换合法性的核心依据是**指针可互转换(pointer-interconvertible)**规则,对应标准[basic.compound]第4款:

    若两个对象为指针可互转换关系,二者拥有完全相同的地址,通过reinterpret_cast在指向二者的指针间做双向转换的行为是标准明确定义的,不属于未定义行为。
    该条款直接枚举了所有指针可互转换的场景,其中明确包含:标准布局类的对象,和它在类定义中第一个声明的非静态数据成员,属于指针可互转换对象。这就是cppreference注释内容的直接条款支撑。

  • 你担心的严格别名规则冲突是对规则覆盖范围的误读:严格别名规则对应标准[basic.lval]第11款,条款中明确列出了所有允许通过不同类型左值访问对象的豁免场景,其中就包含「与被访问对象动态类型指针可互转换的类型」。也就是说,标准布局类对象和其首成员的互转、跨指针访问本身就属于严格别名规则的允许范围,不存在规则矛盾。

注意这个规则的适用限制非常多:只有第一个声明的非静态数据成员适用,类内其他后续成员、非标准布局类(比如存在虚函数、虚基类、非静态数据成员混用不同访问控制符的类)、首元素为空基类子对象的场景都不满足要求,随意执行这类强转会触发未定义行为。

内容的提问来源于stack exchange,提问作者Mike Reed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:30:48