首页  >  文章  >  后端开发  >  ## 将常量引用绑定到临时对象的子对象是否会延长其生命周期?

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

DDD
DDD原创
2024-10-26 07:22:30423浏览

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime?

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

考虑以下代码:

<code class="cpp">#include <stdio.h>

struct P2d {
    double x, y;
    P2d(double x, double y) : x(x), y(y) {}
    ~P2d() { printf("Destructor called\n"); }
};

P2d center() {
    return P2d(10, 10);
}

int main(int argc, const char *argv[]) {
    const double& x = center().x;
    printf("x = %.18g\n", x);
    return 0;
}</code>

在此示例中,center()返回一个临时 P2d 对象。问题出现了:这个临时对象的生命周期是多少?

编译器行为的差异

不同的编译器表现出不同的行为:

  • g (版本5.2.0)在进入main中的printf之前销毁临时P2d对象。但是,它保留其 x 成员的值。值得注意的是,仅当子对象是类或数组类型时,它才会延长临时对象的生命周期。
  • clang 将临时 P2d 对象的生命周期延长到 x 引用的生命周期。因此,析构函数在 main 中 printf 之后调用。

根据 C 标准,绑定对临时对象的子对象的引用不会延长临时对象的生命周期。然而,CWG 1651 涵盖了这一点,它建议进行更改以延长此类情况下的生命周期。

待解决

现状是只有纯右值被视为引用临时值。但是,成员访问表达式(如 center().x)被 g 和 clang 视为纯右值。

  • g 在使用标量子对象时不会延长生命周期,因为 [dcl .init.ref]/(5.2.1.1) 没有涵盖它们。
  • clang 已经实现了“新”生命周期扩展规则,一旦 CWG 1651 得到解决,这将成为正确的行为.

即将到来的决议将阐明成员访问表达式会产生临时表达式,并且绑定对这些表达式的引用可以延长相应临时对象的生命周期。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn