临时对象生命周期延长疑问:传递给bar时为何未被二次延长?
临时对象生命周期延长的疑问
示例代码
void bar(int const & x) //#3 { } void foo(int const & x) //#1 { bar(x); //#2 } int main() { double x = 1.0; foo(static_cast<int>(x)); //#0 }
问题
在#0处通过static_cast<int>(x)创建一个prvalue并传递给foo(#1),该临时对象的生命周期被延长。随后将其传递给bar(#2),此时为何临时对象未被二次延长?且Sanitizer未报告任何问题,遗漏了什么要点?
解答
- 生命周期延长的核心规则:C++里只有当临时对象直接绑定到引用参数/变量时,才会触发生命周期延长,延长至该引用的生命周期结束。在foo函数中,
x是绑定了#0处临时对象的引用,但把x传递给bar的引用参数时,bar的引用绑定的是x指向的对象(也就是原临时对象),这不属于“临时对象直接绑定新引用”的场景,因此不会触发二次延长。 - Sanitizer无报错的原因:原临时对象的生命周期已经被foo的引用
x延长到了foo函数的整个执行周期内。bar的调用是在foo内部执行的,此时临时对象仍然处于存活状态,对它的访问完全合法,不存在悬空引用问题,所以Sanitizer不会检测到错误。
内容的提问来源于stack exchange,提问作者getsoubl
相关产品推荐
相关产品推荐

