将 const 引用绑定到临时对象时,为什么析构函数被调用两次?

发布于 2024-07-17 01:35:37 字数 618 浏览 13 评论 0原文

阅读此内容后Herb Sutter 博客上的文章 中,我进行了一些实验,并遇到了一些让我困惑的事情。 我正在使用 Visual C++ 2005,但如果这是依赖于实现的,我会感到惊讶。

这是我的代码:

#include <iostream>

using namespace std;

struct Base {
    //Base() {}
    ~Base() { cout << "~Base()" << endl; }
};

int main()
{
    const Base & f = Base();
}

运行时,它显示“~Base()两次...但是如果我取消注释构造函数,它只会显示它一次!

有人对此有解释吗?

After reading this article on Herb Sutter's blog, I experimented a bit and ran into something that puzzles me. I am using Visual C++ 2005, but I would be surprised if this was implementation dependent.

Here is my code:

#include <iostream>

using namespace std;

struct Base {
    //Base() {}
    ~Base() { cout << "~Base()" << endl; }
};

int main()
{
    const Base & f = Base();
}

When run, it displays "~Base()" twice... But if I un-comment the constructor, it displays it only once!

Does anyone have an explanation for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转身泪倾城 2024-07-24 01:35:37

这取决于实现。

该标准允许在将临时值绑定到 const 引用时发生复制。 在您的情况下,VC++ 仅在隐式定义构造函数时才执行复制。 这是出乎意料的,但却是允许的。

CWG 问题 391 - 需要将短期引用直接绑定到右值 已修复这适用于 C++11。

This IS implementation-dependent.

The standard allows a copy to occur when binding a temporary to a const reference. In your case, VC++ performs a copy only when the constructor is implicitly defined. This is unexpected, but permitted.

CWG Issue 391 - Require direct binding of short-lived references to rvalues has fixed this for C++11.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文