C++构造期间子类向父类传递成员引用是否属于未定义行为?
结论
这个写法是安全的,不属于未定义行为。
具体原因
- 很多人对构造顺序有个常见误解:觉得父类先构造,所以父类构造跑起来的时候子类成员还没分配内存。实际上构造顺序只管成员什么时候完成初始化,不管内存分配时机——整个
B对象的整块内存在构造流程启动前就已经分配完成,不管是父类Test的子对象部分,还是子类自己的成员a,在进入Test构造函数的时候地址就已经固定,不存在“a还没分配地址”的情况。 - 你的代码里做的操作仅仅是把
a的引用绑定到Test::id成员上,全程没有读写a存储的值,只是拿它的地址初始化引用,这个操作完全符合C++标准要求。构造阶段真正会触发UB的是访问未初始化成员的值,仅取地址、绑定引用不涉及值访问,没有任何问题。 - 你补充说明里提到
id只会在B完全构造完成后才访问,此时a早就完成了初始化,后续通过引用访问a的行为完全合法。
踩坑提醒:如果在
Test的构造函数内部就通过传入的引用读写a的值,才会触发未定义行为——毕竟那时候a还没完成初始化,值访问是非法的,但你给出的场景不存在这个问题。
内容的提问来源于stack exchange,提问作者ChrisMM
相关产品推荐
相关产品推荐

