临时容器元素可通过const引用延长生命周期吗?C++标准是否保证?
问题解答
结论
你的代码中r是悬垂引用,访问它属于未定义行为,C++标准不保证其有效性。
原因分析
1. 临时对象生命周期延长的规则限制
C++标准规定,当const左值引用直接绑定到临时对象,或直接绑定到临时对象的基类子对象、成员子对象时,临时对象的生命周期会被延长至引用的生命周期结束。但这个规则有关键限制:
- 若引用是通过函数调用返回的引用来间接绑定(比如你的代码中
func()["foo"]是unordered_map::operator[]的返回值),则临时对象的生命周期不会被延长。 - 在
const auto& r = func()["foo"];这行代码中,func()生成的临时unordered_map是一个临时对象,调用operator[]后返回的是容器内元素的引用,但r绑定的是这个返回的引用,而非直接绑定到临时容器或它的成员。因此临时容器会在该完整表达式结束后立即销毁,导致r指向已被释放的内存。
2. 容器元素不属于容器的子对象
标准容器(如std::unordered_map)的元素并非存储在容器对象自身的内存布局中,而是存储在动态分配的内存区域,容器对象仅持有指向这些元素的指针、迭代器或控制结构。因此容器元素不属于容器对象的子对象(子对象指直接作为对象一部分存储的成员、基类实例等),即便生命周期延长规则适用于子对象,这里也不满足条件。
内容的提问来源于stack exchange,提问作者christosc
相关产品推荐
相关产品推荐

