如果我有以下类型:
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;
答案 0 :(得分:3)
假设你在谈论这一行:
Data d2 = d1;
无论如何都会发生副本,因为d1
不是左值。
您可以改用:
Data d2 = std::move(d1);
在这种情况下,将采取行动。由于您还没有定义自己的复制构造函数,复制赋值运算符,移动赋值运算符或析构函数,因此您的类将自动获取移动构造函数。
答案 1 :(得分:2)
在这种情况下,您将进行复制构造调用,因为两个对象d1和d2可以同等访问,并且可以单独使用。
仅当编译器可以保证移动后无法访问moveable时,才会应用移动构造函数。
函数的返回值将从r:
构造Data foo() {
Data r = {1,2,3};
return r; // will construct retval using move semantic
}
Data t = foo();
因函数返回后无法访问。
答案 2 :(得分:1)
如果未在类中定义复制构造函数,则编译器本身会定义一个。如果类具有指针变量并具有一些动态内存分配,则必须具有复制构造函数。reference tutorialPoint