1

作为这个问题的延伸,我试图让我的移动分配正确。

我有以下代码:

// 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): note: or 'LinkedList &LinkedList::operator =(LinkedList) noexcept' (指向复制赋值运算符)

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

我的移动赋值运算符是错误的,还是我以错误的方式使用它?

4

1 回答 1

5

复制赋值运算符将采用 a const LinkedList<T>& other,而不是 a LinkedList<T> other

这个

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

是如何使用copy-and-swap一次实现复制和移动分配。通过重新使用复制和移动构造函数(other是复制构造或移动构造),您只需thisother. other在函数结束时死掉,带走this. 这个实现完全没问题,但是你不需要临时的第二次重载(这确实是模棱两可的)。

如果您想为复制分配和移动分配提供单独的复制分配运算符,签名将是

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

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

但是由于您已经拥有swap了复制+移动构造函数,因此最好使用复制和交换。

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

于 2019-11-26T15:59:01.753 回答