将 const 引用绑定到临时对象时,为什么析构函数被调用两次?
阅读此内容后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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这取决于实现。
该标准允许在将临时值绑定到 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.