复制和交换成语混淆

时间:2014-11-18 10:03:26

标签: c++ c++11

使用链表在堆栈中考虑这个完全正常工作的复制和交换习惯用法。

//first is the pointer to the recently added node
//n is the size of the stack
template<class T>
Stack<T>& Stack<T>::operator=(Stack&& s) {
    Stack<T> copy{s};
    std::swap(copy.n,n);
    std::swap(copy.first,first);
    return *this;
}

根据this,std :: swap“交换给定值。”所以我想为什么不交换两个堆栈的整个值,为什么只是它的项目?

template<class T>
Stack<T>& Stack<T>::operator=(Stack&& s) {
    Stack<T> copy{s};
    std::swap(copy, *this);
    return *this;
}

为什么不定义?

2 个答案:

答案 0 :(得分:6)

您已经引入了无限递归。赋值运算符是std::swap在引擎盖下使用的结构之一,因此operator=会调用swap来调用operator=,这将调用swap会拨打operator=,呼叫swap,呼叫operator=,呼叫swap,呼叫operator=,呼叫swap,呼叫operator= swap会调用operator=来调用{{1}}分段错误

答案 1 :(得分:4)

正如hvd解释的那样,在std::swap()内使用operator =会导致无限递归。

但是,如果你的类实现了一个不在类上调用operator =的正确的swap()成员函数,那么就没有这样的危险。在这种情况下,操作员可以安全地在复制构造方面实施。

Stack<T>(source).swap(*this);