C++临时对象生命周期扩展:含函数调用的完整表达式判定
结论
你的判断完全正确,给出的std::copy_if调用代码是安全的,不会触发悬空引用问题。
规则细节说明
C++标准对绑定到const引用的临时对象生命周期边界有明确规定:
- 临时对象绑定到函数(包括构造函数)的引用形参时,生命周期仅持续到包含本次函数调用的完整表达式结束,不会因为该引用后续被存储为类的成员变量,就自动延长临时对象的存活时间。
- 你给出的错误示例中,
MyIterator it = {myContainer, {stuff1, stuff2, stuff3}};本身就是一个独立的完整表达式,初始化列表生成的临时std::vector<Stuff>在这行语句末尾的分号位置就会被销毁,之后it内部存储的stuffVector引用自然成为悬空引用,完全符合规则描述。 - 回到
std::copy_if的调用场景,包含MyIterator构造动作的完整表达式是整个std::copy_if(...)调用语句。临时vector从构造完成开始,会一直存活到std::copy_if执行完所有遍历逻辑、函数返回之后才会被销毁,完全覆盖了迭代器在算法内部被解引用、递增等所有使用场景,因此内部持有的引用始终有效。
关键边界澄清
生命周期扩展不存在链式传递效果。临时对象的销毁时机只由它第一次被绑定的引用场景决定,后续不管有多少层其他引用(包括类的引用成员)指向这个临时对象,都不会改变它的生命周期长度。
只有当临时对象直接绑定到一个作用域内的局部引用变量时,它的生命周期才会延长到和该局部变量一致;凡是绑定到函数形参的临时对象,寿命永远截止到外层完整表达式结束,不会有额外延长。
你给出的copy_if场景刚好落在规则的安全区间内:临时对象的存活范围完全覆盖了它被访问的全部代码路径,因此代码行为是符合C++标准、完全可预期的。
内容的提问来源于stack exchange,提问作者user2891462
相关产品推荐
相关产品推荐

