38

私は、この質問に関するこの完全な説明に従って、copy-swap イディオムを学び、採用しようとしていました: Copy-Swap Idiom .

しかし、見たことのないコードを見つけました:using std::swap; // allow ADLこの例では

class dumb_array
{
public:
    // ...

    void swap(dumb_array& pOther) // nothrow
    {
        using std::swap; // allow ADL    /* <===== THE LINE I DONT UNDERSTAND */

        swap(mSize, pOther.mSize); // with the internal members swapped,
        swap(mArray, pOther.mArray); // *this and pOther are effectively swapped
    }
};
  1. using std::swap;関数実装の本体内での意味は何ですか?
  2. ADL とはどういう意味ですか?
4

3 に答える 3

79

このメカニズムは通常、テンプレート化されたコードで使用されますtemplate <typename Value> class Foo

問題は、どのスワップを使用するかです。std::swap<Value>動作しますが、理想的ではない可能性があります。swapfor typeのより良いオーバーロードがある可能性は十分Valueにありますが、それはどの名前空間にあるでしょうか? それはほぼ間違いなくstd::(違法であるため)ではありませんが、の名前空間にある可能性が非常に高いですValue。可能性は高いですが、確実とは言えません。

その場合、swap(myValue, anotherValue)可能な限り「最良の」スワップが得られます。Argument Dependent Lookup は、元の名前空間でスワップを見つけますValue。それ以外の場合、usingディレクティブが開始され、std::swap<Value>インスタンス化されて使用されます。

あなたのコードでmSizeは、おそらく整数型でありmArray、ポインターです。どちらにも関連付けられた名前空間std::swapはなく、99.9% の確率でそれらに最適です。したがって、using std::swap;宣言はここでは役に立たないようです。

于 2011-01-24T13:57:18.780 に答える
13

usingキーワードにはスコープ効果があります。

これは、キーワードのスコープ内でstd::swap参照できることを意味します。swapusing

于 2011-01-24T13:47:04.503 に答える