移动构造函数与移动分配

单宁

作为对该问题的扩展,我正在尝试正确设置我的移动分配。

我有以下代码:

// copy assignment operator
LinkedList<T>& operator= (LinkedList<T> other) noexcept
{
    swap(*this, other);
    return *this;
}

// move assignment operator
LinkedList<T>& operator= (LinkedList<T>&& other) noexcept
{
    swap(*this, other);
    return *this;
}

但是,当我尝试使用它时,我的代码无法编译。

首先一些代码:

LinkedList<int> generateLinkedList()
{
    LinkedList<int> List;   
    List.add(123);
    return List;
}


int main()
{
    LinkedList<int> L;   
    L = generateLinkedList();
      ^ get an error here...

我收到以下错误:

main.cpp(24):错误C2593:'operator ='不明确

linkedlist.h(79):注意:可以是'LinkedList&LinkedList :: operator =(LinkedList &&)noexcept'(指向移动分配运算符)

linkedlist.h(63):注意:或'LinkedList&LinkedList :: operator =(LinkedList)noexcept'(指向副本分配运算符)

main.cpp(24):注意:在尝试匹配参数列表'(LinkedList,LinkedList)'时

我的移动分配运算符是错误的,还是使用错误的方式?

马克斯·兰霍夫

复制分配运算符将采用const LinkedList<T>& other,而不是LinkedList<T> other

这个

LinkedList<T>& operator= (LinkedList<T> other) noexcept
{
    swap(*this, other);
    return *this;
}

这是一个使用copy-and-swap同时实现复制和移动分配的方式通过重复使用copy和move构造函数(other可以是复制构造的或move构造的),只需this交换即可otherother死在函数的末尾,并带有的旧状态this这个实现是完全可以的,但是您不需要为临时对象再造成第二个重载(这确实是模棱两可的)。

如果要为复制与移动分配提供单独的复制分配运算符,则签名应为

// copy assignment operator
LinkedList<T>& operator=(const LinkedList<T>& other) noexcept
{
  //...
}

// move assignment operator
LinkedList<T>& operator=(LinkedList<T>&& other) noexcept
{
  //...
}

但是由于您已经拥有swap了copy + move构造函数,因此最好使用copy-and-swap。

PS:由于这些似乎是内联定义(即在类主体内),因此可以跳过<T>模板参数-在LinkedList模板类定义内,LinkedList自动编写是指“当前实例化”(即LinkedList<T>)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

调用std :: move而不移动构造函数或移动分配

来自分类Dev

C ++移动分配触发器首先移动构造函数

来自分类Dev

移动构造函数不移动

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

自动移动构造函数

来自分类Dev

尝试根据移动分配编写Move构造函数

来自分类Dev

为什么当用户提供移动构造函数或移动分配时,复制构造函数和复制分配会被删除?

来自分类Dev

具有移动构造函数和分配的类的默认副本构造函数和分配

来自分类Dev

移动分配和移动构造函数均从函数调用中发出

来自分类Dev

C ++移动副本构造函数和移动分配运算符

来自分类Dev

我应该删除智能指针的移动构造函数和移动分配吗?

来自分类Dev

移动分配运算符和移动构造函数之间的区别?

来自分类Dev

移动构造函数和移动分配。基类的运算符

来自分类Dev

移动构造函数绕过复制构造函数

来自分类Dev

移动构造函数不能默认

来自分类Dev

移动构造函数未调用

来自分类Dev

Noexcept并复制,移动构造函数

来自分类Dev

移动构造函数与复制省略

来自分类Dev

移动指针类型的构造函数?

来自分类Dev

使用memcpy移动构造函数

来自分类Dev

尚未调用移动构造函数

来自分类Dev

移动std :: unique_ptr的构造函数/分配:内存重新分配?

来自分类Dev

当复制elison失败时,是否有办法防止移动构造函数后跟移动分配运算符?

来自分类Dev

移动,复制分配,复制构造函数似乎无需定义即可工作

来自分类Dev

如果仅定义复制构造函数/ oper =,为什么不隐式声明移动构造函数/移动分配并将其定义为已删除?

来自分类Dev

复制/移动省略与显式删除的复制/移动构造函数

来自分类Dev

C ++ 11实现移动构造函数并移动成员向量

Related 相关文章

  1. 1

    调用std :: move而不移动构造函数或移动分配

  2. 2

    C ++移动分配触发器首先移动构造函数

  3. 3

    移动构造函数不移动

  4. 4

    默认移动构造函数

  5. 5

    默认移动构造函数

  6. 6

    默认移动构造函数

  7. 7

    自动移动构造函数

  8. 8

    尝试根据移动分配编写Move构造函数

  9. 9

    为什么当用户提供移动构造函数或移动分配时,复制构造函数和复制分配会被删除?

  10. 10

    具有移动构造函数和分配的类的默认副本构造函数和分配

  11. 11

    移动分配和移动构造函数均从函数调用中发出

  12. 12

    C ++移动副本构造函数和移动分配运算符

  13. 13

    我应该删除智能指针的移动构造函数和移动分配吗?

  14. 14

    移动分配运算符和移动构造函数之间的区别?

  15. 15

    移动构造函数和移动分配。基类的运算符

  16. 16

    移动构造函数绕过复制构造函数

  17. 17

    移动构造函数不能默认

  18. 18

    移动构造函数未调用

  19. 19

    Noexcept并复制,移动构造函数

  20. 20

    移动构造函数与复制省略

  21. 21

    移动指针类型的构造函数?

  22. 22

    使用memcpy移动构造函数

  23. 23

    尚未调用移动构造函数

  24. 24

    移动std :: unique_ptr的构造函数/分配:内存重新分配?

  25. 25

    当复制elison失败时,是否有办法防止移动构造函数后跟移动分配运算符?

  26. 26

    移动,复制分配,复制构造函数似乎无需定义即可工作

  27. 27

    如果仅定义复制构造函数/ oper =,为什么不隐式声明移动构造函数/移动分配并将其定义为已删除?

  28. 28

    复制/移动省略与显式删除的复制/移动构造函数

  29. 29

    C ++ 11实现移动构造函数并移动成员向量

热门标签

归档