【发布时间】:2013-01-12 20:27:18
【问题描述】:
我想了解更多关于右值引用的信息,但我陷入了这个最简单的例子:
#include <iostream>
using namespace std;
struct C {
C() { cout << "C()\n"; }
~C() { cout << "~C()\n"; }
C(const C&) { cout << "C(const C&)\n"; }
C& operator=(const C&) { cout << "operator=(const C&)\n"; return *this; }
C(C&&) { cout << "C(C&&)\n"; }
C& operator=(C&&) { cout << "operator=(C&&)\n"; return *this; }
};
C foo() { C c; return c; }
int main()
{
const C c = foo();
return 0;
}
我已经用 Clang 3.2 和 -std=c++11 -fno-elide-constructors 编译它(以避免 (N)RVO),但结果让我感到惊讶:
C()
~C() // huh?
C(C&&)
~C()
~C()
除了第一个~C(),我完全预料到了这一点。它是从哪里来的,我错过了什么,因为有 2 个构造和 3 个破坏? && 构造函数是否使用已销毁的对象引用调用??
【问题讨论】:
-
在调试器中单步执行并查看调用的来源。没错,构造函数调用的次数和析构函数调用的次数应该是一样的。
-
我收到了这个liveworkspace.org/code/IlzNk$0 这是预期的结果
-
@SethCarnegie:但是您选择了 GCC 4.7.2,不是吗?我尝试选择 clang 3.2,我得到了 OP 显示的输出
-
@AndyProwl 和 chrisaverage 是的,可能是 clang 有一个错误,因为我不明白你怎么能拥有比构造函数更多的析构函数,而且你已经为所有方式编写了函数可以构造/分配对象。我要试试看,稍等。
-
这个老问题stackoverflow.com/questions/12241448/… 的答案指向一个 Clang 错误报告。不确定该错误是否仍然存在,以及它是否落后于 OP 到达这里的结果。