首页 > 后端开发 > C++ > 正文

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

Susan Sarandon
发布: 2024-10-29 05:20:30
原创
906 人浏览过

## Does Binding a Const Reference to a Temporary Object's Sub-part Extend its Lifetime?

对临时对象子部分的 const 引用可以延长对象的生命周期吗?

考虑以下代码片段:

<code class="c++">#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>
登录后复制

当使用 GCC 5.2.0 编译时,P2d 临时实例在进入 main 中的 printf 调用之前被销毁。尽管如此,x 的值仍被保留并正确打印。换句话说,不是将 x 直接绑定到 P2d 临时的 x 成员,而是创建第二个临时双精度值来复制该成员的值。

另一方面,Clang 将 P2d 临时的生命周期延长到生命周期x 引用,导致析构函数在 main 中的 printf 之后被调用。

这就提出了一个问题:这种行为是 GCC 中的错误还是标准允许的?

分析

CWG 1651 解决了此问题:

The resolution of issues 616 and 1213, making the result of a member access or subscript expression applied to a prvalue an xvalue, means that binding a reference to such a subobject of a temporary does not extend the temporary's lifetime. [class.temporary] should be revised to ensure that it does.
登录后复制

当前,[class.temporary]/5 指出:“第二个上下文是引用绑定到临时对象时。 ”这已被解释为仅适用于直接绑定到临时对象的引用。因此,在上面的代码片段中,center().x 被视为纯右值(Clang 和 GCC 都如此),并且 [class.temporary]/5 不适用。

但是,GCC 和 Clang 有尚未实施DR 1651决议,即N3918。该决议明确指出“应用于临时表达式的成员访问和下标表达式会产生临时表达式”,并补充说“相应的临时对象(如果有)在引用的生命周期内持续存在。”

因此,根据 N3918 的措辞,Clang 似乎正在实现预期的行为,而 GCC 则没有。 DR 60297 指出,GCC 不会延长临时标量子对象的生命周期,因为它们没有被 [dcl.init.ref]/(5.2.1.1) 覆盖。

总之,GCC 中的当前行为是根据标准当前的措辞,这是正确的,但在这种情况下,标准可能会被修改为要求延长使用寿命。 Clang 已经实现了预期的未来行为。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!