将常量引用绑定到子对象时的行为临时值由 C 标准定义,并根据编译器供应商的不同而变化。
根据 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中文网其他相关文章!