2016-08-06 8 views
7

前にC++ 11には、常にいつものように、const参照によって渡す必要が代入演算子をコピーする場合があった。代入演算子をconst参照または値で渡す必要がありますか?

template <typename T> 
ArrayStack<T>& operator= (const ArrayStack& other); 

しかし、移動代入演算子やコンストラクタの導入と、それは思わその代わりにコピー代入の代わりに値渡しを使用することを提唱している人もいます。移動代入演算子も追加する必要があります

template <typename T> 
ArrayStack<T>& operator= (ArrayStack other); 
ArrayStack<T>& operator= (ArrayStack&& other); 

上記2オペレータの実装は次のようになります。

template <typename T> 
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack other) 
{ 
    ArrayStack tmp(other); 
    swap(*this, tmp); 
    return *this; 
} 

template <typename T> 
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack&& other) 
{ 
    swap(*this, other); 
    return *this; 
} 

が、Cのためのコピー代入演算子を作成するときに値渡しを使用することをお勧めします++ 11以降?どのような状況で私はそうするべきですか? C++ 11に

+4

'operator =(ArrayStack)'はコピー 'tmp'を作成する理由がありません。 – aschepler

+3

http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014 slides 43-53 –

+0

値渡しのバージョンでは、通常、コピーアンドスワップによって移動およびコピーの割り当てを行うことができます。 –

答えて

11

前に、それは必ずしも限らないconst参照

によって渡す必要が代入演算子をコピーする場合でした。最良のアプローチは常にthe copy-and-swap idiomを使用していました。これはあなたがここで見ているものです(ただし、本体の実装は最適ではありません)。

これはより小さく、で、C++ 11で便利なので、移動割り当て演算子もあります。

+0

だから私は何も変わっていないと思いますが、コピー代入演算子とconst代入演算子の両方を提供することはまだ標準です。 – Mantracker

+0

@Mantracker:あなたはリンクされた答えを読むべきです。実際には、あなたのステートメントに基づいてこの答えも読んでください。 "私が言ったことと直接矛盾しているのは、依然としてコピー代入演算子にconst参照を提供することが標準です。 –

+3

BTW nice penguins –

関連する問題