簡體   English   中英

復制和交換成語混淆

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM