【发布时间】:2014-09-03 12:28:01
【问题描述】:
作为一个 C++ 新手,我真的很难理解 C++11 的新 Move-Constructor,我希望有人能解释一下我偶然发现的具体情况。让我们来看看这个示例代码:
#include <iostream>
using namespace std;
class Model {
public:
int data;
Model(int data) : data(data) { cout << "Constructor" << endl; }
Model(Model&& model) { cout << "Move constructor" << endl; }
~Model() { cout << "Destructor" << endl; }
private:
Model(const Model& model);
const Model& operator=(const Model&);
};
Model createModel(int data) {
return Model(data);
}
int main(void) {
Model model = createModel(1);
cout << model.data << endl;
return 0;
}
所以我创建了一个createModel 函数,它应该将模型作为临时右值返回,我想将它分配给左值。我不希望编译器创建Model 对象的副本,因此我将复制构造函数定义为私有,并且我对赋值运算符执行相同操作以确保没有数据被复制。执行此操作后,代码不再正确编译,因此我添加了 Move 构造函数,现在它再次编译。但是当我运行程序时,我得到了这个输出:
Constructor
1
Destructor
因此从未调用过移动构造函数。我不明白为什么我必须指定移动构造函数才能在运行时根本不使用程序时编译程序。
是因为编译器(GCC 4.8.2)优化了移动构造器吗?或者这里还有什么其他的魔法?
那么有人可以解释一下上面的代码到底发生了什么吗?代码做了我想要的,但我真的不明白为什么。
【问题讨论】:
-
搜索“返回值优化”(RVO),这个已经讨论过很多了(包括这里)。
标签: c++ c++11 move-semantics