首页 > 后端开发 > C++ > ## **将常量引用绑定到临时对象的子对象是否会延长其生命周期? GCC 和 Clang 的故事**

## **将常量引用绑定到临时对象的子对象是否会延长其生命周期? GCC 和 Clang 的故事**

Barbara Streisand
发布: 2024-11-01 06:58:02
原创
570 人浏览过

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

将常量引用绑定到临时对象的子对象

标准行为

将常量引用绑定到子对象时的行为临时值由 C 标准定义,并根据编译器供应商的不同而变化。

GCC 和 Clang差异

  • GCC(版本 5.2.0): 在 main 中输入 printf 之前销毁临时 P2d 实例,通过创建另一个临时双精度值来保留值。
  • Clang(版本 X): 将临时 P2d 实例的生命周期延长到 x 的生命周期引用,在 main 中的 printf 之后调用析构函数。

说明

根据 CWG 1651,应用于纯右值的成员访问或下标表达式的结果应被视为 xvalue 。这意味着绑定对临时对象的此类子对象的引用不应延长临时对象的生命周期。

但是,在提供的示例中,两个编译器都将 center().x 视为纯右值。使用标量子对象时,GCC 不会延长生命周期,因为[dcl.init.ref]/(5.2.1.1) 未涵盖它们。因此,临时对象可以提前销毁。

相比之下,Clang 已实现了 DR 1651 的未决解决方案,其中规定如果 E1 是临时表达式并且 E2 没有指定位字段,则 E1 .E2 是一个临时表达式。由于根据此定义,center() 是一个临时表达式,因此 [class.temporary] /5 中的修改措辞适用。它明确指出相应的临时对象在引用的生命周期内持续存在。

因此,在这种情况下,Clang 延长了临时 P2d 实例的生命周期,而 GCC 则没有。

结论

一旦 C 标准的拟议修订被采纳,GCC 和 Clang 中的当前行为预计都会改变。

以上是## **将常量引用绑定到临时对象的子对象是否会延长其生命周期? GCC 和 Clang 的故事**的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板