【问题标题】:C++ - Move assignment operator without custom swap function?C++ - 没有自定义交换功能的移动赋值运算符?
【发布时间】:2020-07-19 11:18:16
【问题描述】:

我正在阅读 Stroustrup 的书(第 4 版)并看到了这个例子:

template<typename T, typename A = allocator<T>>
struct vector_base {                    // memory structure for vector
    A alloc;        // allocator
    T* elem;        // start of allocation
    T* space;       // end of element sequence, start of space allocated for possible expansion
    T* last;        // end of allocated space

    vector_base(const A& a, typename A::size_type n, typename A::size_type m =0)
        : alloc{a}, elem{alloc.allocate(n+m)}, space{elem+n}, last{elem+n+m} { }
    ~vector_base() { alloc.deallocate(elem,last-elem); }

    vector_base(const vector_base&) = delete;           // no copy operations
    vector_base& operator=(const vector_base&) = delete;

    vector_base(vector_base&&);                     // move operations
    vector_base& operator=(vector_base&&);
};

template<typename T, typename A>
vector_base<T,A>::vector_base(vector_base&& a)
    : alloc{a.alloc},
    elem{a.elem},
    space{a.space},
    last{a.last}    
{
    a.elem = a.space = a.last = nullptr;    // no longer owns any memory
}

template<typename T, typename A>
vector_base<T,A>& vector_base<T,A>::operator=(vector_base&& a)
{
    swap(*this,a);
    return *this;
}

来自this answer,我了解到您不能只在赋值运算符中使用std::swap(*this, other),因为std::swap 通常是根据赋值运算符本身来实现的。因此,您首先需要提供自己的自定义swap 函数。

这是一个错误,还是我遗漏了什么?

【问题讨论】:

  • 如果您不提供自己的交换,您可能会得到一个“通用”效率较低的交换。
  • @Eljay 这不是我所理解的。如果通用交换执行T tmp = a; a = std::move(b); b = std::move(tmp);,那么ab 的移动分配将依次再次调用swap,无休止,对吧?
  • 那也是个问题。就像在赋值方面实现赋值的代码一样。
  • 在 C++ 中可以通过不同的方式实现很多东西,因此请仔细阅读以确保您所使用的部分可以协同工作。

标签: c++ swap


【解决方案1】:

看起来这是 Usage of std::swap() inside move assignment should cause endless recursion (and causes), but it is an example from Stroustrup's book 的副本。似乎 Stroustrup 确实定义了一个自定义交换函数;我好像错过了。

编辑:我还没有找到交换功能。好像是书上写错了。

【讨论】:

  • 我没有在书中找到自定义的swap。但你绝对需要它。
  • 是的,我也没有找到。我想这可能是一个错误。
猜你喜欢
  • 2021-06-08
  • 2016-03-02
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2020-12-15
  • 2018-11-24
相关资源
最近更新 更多