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

C++构造期间子类向父类传递成员引用是否属于未定义行为?

结论

这个写法是安全的,不属于未定义行为。

具体原因
  • 很多人对构造顺序有个常见误解:觉得父类先构造,所以父类构造跑起来的时候子类成员还没分配内存。实际上构造顺序只管成员什么时候完成初始化,不管内存分配时机——整个B对象的整块内存在构造流程启动前就已经分配完成,不管是父类Test的子对象部分,还是子类自己的成员a,在进入Test构造函数的时候地址就已经固定,不存在“a还没分配地址”的情况。
  • 你的代码里做的操作仅仅是把a的引用绑定到Test::id成员上,全程没有读写a存储的值,只是拿它的地址初始化引用,这个操作完全符合C++标准要求。构造阶段真正会触发UB的是访问未初始化成员的值,仅取地址、绑定引用不涉及值访问,没有任何问题。
  • 你补充说明里提到id只会在B完全构造完成后才访问,此时a早就完成了初始化,后续通过引用访问a的行为完全合法。

踩坑提醒:如果在Test的构造函数内部就通过传入的引用读写a的值,才会触发未定义行为——毕竟那时候a还没完成初始化,值访问是非法的,但你给出的场景不存在这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.08 16:15:17