繁体   English   中英

自动移动构造函数

[英]Automatic move constructor

如果我有以下类型:

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

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

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

假设您正在谈论这一行:

Data d2 = d1;

由于d1不是右值,因此无论复制都会发生。

您可以改用以下方法:

Data d2 = std::move(d1);

在这种情况下,将发生移动。 由于尚未定义自己的副本构造函数,副本赋值运算符,移动赋值运算符或析构函数,因此您的类将自动获得move构造函数。

在这种情况下,您将具有复制构造调用,因为两个对象d1和d2是可以同等访问的,并且可以分别使用。

仅当编译器可以保证在移动之后将不可访问moveable时,才会应用Move构造函数。

该函数的返回值将从r移动:

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

Data t = foo();  

由于r在函数返回后无法访问。

如果未在类中定义副本构造函数,则编译器本身将定义一个。 如果该类具有指针变量并具有一些动态内存分配,则必须具有副本构造函数。 参考tutorialPoint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM