为什么只有未命名的对象在完整表达式结束之前还活着,为什么还需要一个移动构造函数? 如果我们有这段代码:
class Example6 {
string* ptr;
public:
Example6 (const string& str) : ptr(new string(str)) {}
~Example6 () {delete ptr;}
// move constructor
Example6 (Example6&& x) : ptr(x.ptr) {x.ptr=nullptr;}
// move assignment
Example6& operator= (Example6&& x) {
delete ptr;
ptr = x.ptr;
x.ptr=nullptr;
return *this;
}
};
int main () {
Example6 bar = Example6("ple"); // move-construction
return 0;
}
我们有一个右值引用作为移动构造函数和赋值操作的参数。在这种情况下,bar
的移动构造函数在初始化为同一类的临时对象时被调用。我不明白的是:既然临时对象有完整表达式的生命周期,为什么需要移动构造函数而不是复制构造函数?我的意思是,隐式定义的移动构造函数和赋值运算符从临时中“删除”数据,即使这些数据在分号后都会被销毁,所以为什么你需要一个移动构造函数,它在某种程度上与复制构造函数相同......为什么需要删除来自临时文件的数据无论如何都会在分号后被销毁?
最佳答案
C++ 添加移动构造函数主要是为了帮助提高性能。根本不使用移动构造函数就可以进行适当的资源管理。事实上,在引入移动构造函数之前,C++ 就是这样做的。
复制然后销毁临时对象的问题是被调用的复制构造函数不知道它被赋予了一个临时对象来复制。因此,复制构造函数必须复制数据,就像它的源不是临时的一样,可能会在复制对象的过程中分配额外的资源。
当编译器知道您将要复制临时文件时,它会让您知道您可以根据需要收集尽可能多的内部信息,从而有可能为您节省一些昂贵的分配。
关于c++ - 无论如何,当临时对象被销毁时,为什么还需要一个移动构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44144642/