使用链表在堆栈中考虑这个完全正常工作的复制和交换习惯用法。
//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;
}
为什么不定义?
答案 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);