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

C++中绑定到new-initializer引用的临时对象生命周期是多久?

结论

该临时对象会持续到整个S* p = new S{ 1, {2,3} }完整表达式求值完成,而非仅到new S{ 1, {2,3} }子表达式求值结束。

依据说明

  • 你引用的C++标准条款明确规定:绑定到new-initializer中引用的临时对象,生命周期截止到包含该new-initializer的完整表达式执行完成。
  • C++中「完整表达式」的定义是不被其他表达式包含的顶层表达式,此处new S{ 1, {2,3} }是赋值表达式的右操作数子表达式,整个S* p = new S{ 1, {2,3} }才是顶层的完整表达式,因此临时对象的生命周期会覆盖整个赋值过程。

关于悬空引用的说明

即使临时生命周期覆盖了整个赋值表达式,赋值完成后临时对象会立即销毁,但堆上S对象的引用成员mp仍然指向已经销毁的临时内存空间,因此后续访问p->mp的行为都是未定义的,这也和标准示例中的注释creates dangling reference对应。
补充:如果是栈上声明的局部对象S a { 1, {2,3} };,绑定到引用成员的临时对象生命周期会被延长到和a的生命周期一致,属于临时生命周期延长的常规场景,而new初始化是标准明确列出的例外场景,不适用该常规延长规则。

内容的提问来源于stack exchange,提问作者Géry Ogam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:57:05