自动移动构造函数
Automatic move constructor
如果我有以下类型:
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。
如果未在类中定义复制构造函数,则编译器本身会定义一个。如果类具有指针变量并且具有一些动态内存分配,则必须具有复制构造函数。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中