自动移动构造函数

Automatic move constructor

本文关键字:构造函数 移动      更新时间:2023-10-16

如果我有以下类型:

struct Data
{
    std::string str;
    std::vector<int> vec;
    float f;
private:
    Data(){}
};

而且我没有定义移动构造函数,如果我执行以下操作会发生复制吗?

Data d1;
d1.str = "abc";
d1.vec = {1, 2, 3};
Data d2 = d1;

假设你正在谈论这一行:

Data d2 = d1;

无论如何,副本都会发生,因为d1不是右值。

您可以改用它:

Data d2 = std::move(d1);

在这种情况下,将发生移动。 您的类将自动获取移动构造函数,因为您尚未定义自己的复制构造函数、复制赋值运算符、移动赋值运算符或析构函数。

在这种情况下,

您将具有复制构造调用,因为两个对象 d1 和 d2 同样可访问并且可以单独使用。

仅当编译器可以保证在移动后无法访问可移动时,才会应用移动构造函数。

函数的返回值将从 r 构造:

Data foo() {
  Data r = {1,2,3};
  return r; // will construct retval using move semantic
}
Data t = foo();  

因为函数返回后无法访问 R。

如果未在类中定义复制构造函数,则编译器本身会定义一个。如果类具有指针变量并且具有一些动态内存分配,则必须具有复制构造函数。