布局兼容类型间reinterpret_cast的合法性及编译器风险咨询
相同布局结构体类型转换的合法性与未定义行为疑问
背景
我对相同布局的不同类型对象之间的转换操作合法性存在困惑。相关问题在Stack Overflow上的回答存在矛盾:部分回答否定该操作的安全性,另一部分则持肯定态度,且各自依据C++标准的不同条款解释,反而加剧了困惑。
我希望明确两方面内容:
- C++标准中关于该操作的可行范围与未定义行为的明确规定
- 从编译器视角出发,该操作可能引发的后果(尤其是严格别名规则与基于类型的优化相关问题)
假设存在两个布局完全一致的标准布局结构体:
struct A { int i; float x; }; struct B { int j; float y; };
核心争议
相关提问的采纳回答均认可reinterpret_cast转换本身的合法性:
A a { 1, 2.3 }; auto& b = reinterpret_cast<B&>(a); // 双方均认为此操作合法
但对后续通过转换后的引用访问成员的行为,结论完全相反:
auto ai = b.j; // 一方认为是未定义行为,另一方认为完全合法
其中,一方指出该访问违反严格别名规则(但提及的标准条款已更新,可能不再适用);另一方则以结构体布局完全一致为由,判定操作合法。
具体疑问
若“访问成员属于未定义行为”的结论正确
- C++标准中哪部分条款明确规定通过
b.j访问a.i属于未定义行为? - 在启用严格别名规则的情况下,编译器视角下该操作存在哪些具体风险?(需详细描述可能发生的编译/运行时情况)
若“操作完全合法”的结论在C++11中成立
- 该结论在C++17及后续标准中是否依然有效?
- 考虑严格别名规则,是否存在编译器判定
b无法通过a修改的风险?
内容的提问来源于stack exchange,提问作者shrike
相关产品推荐
相关产品推荐

