[英]copy-and-swap idiom confusion
使用鏈表在堆棧中考慮這個完全正常工作的復制和交換習慣用法。
//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;
}
根據這個 ,std :: swap“交換給定的值。” 所以我想為什么不交換兩個堆棧的整個值,為什么只是它的項目?
template<class T>
Stack<T>& Stack<T>::operator=(Stack&& s) {
Stack<T> copy{s};
std::swap(copy, *this);
return *this;
}
為什么不定義?
你引入了無限遞歸。 賦值運算符是std::swap
在引擎蓋下使用的構造之一,所以你的operator=
將調用swap
,它將調用operator=
,這將調用swap
,這將調用operator=
,這將調用swap
,這將調用operator=
調用swap
這將調用operator=
這將調用swap
這將調用operator=
這將調用swap
這將調用operator=
分段故障
正如hvd解釋的那樣,在operator =
使用std::swap()
會導致無限遞歸。
但是,如果你的類實現了一個不在類上調用operator =
的正確的swap()成員函數,那么就沒有這樣的危險。 在這種情況下,操作員可以安全地在復制構造方面實施。
Stack<T>(source).swap(*this);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.