что означает `использование std :: swap` внутри тела реализации метода класса? - PullRequest
26 голосов
/ 24 января 2011

Я пытался изучить и принять идиому копирования-обмена, следуя этому подробному объяснению по этому вопросу: Идиома копирования-замены .

Но я нашел код, который никогда не видел: 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?

Ответы [ 3 ]

60 голосов
/ 24 января 2011

Этот механизм обычно используется в шаблонном коде, т.е. template <typename Value> class Foo.

Теперь вопрос в том, какой обмен использовать. std::swap<Value> будет работать, но это может быть не идеально. Есть большая вероятность, что для типа Value лучше перегрузка swap, но в каком пространстве имен это будет? Это почти наверняка не в std:: (поскольку это незаконно), но вполне вероятно в пространстве имен Value. Вероятно, но далеко не уверен.

В этом случае swap(myValue, anotherValue) даст вам «лучший» своп. Аргумент Зависимый поиск найдет любой своп в пространстве имен, откуда взялся Value. В противном случае вступит в силу директива using, и std::swap<Value> будет создан и использован.

В вашем коде mSize, скорее всего, является целочисленным типом, а mArray указателем. Ни у одного из них нет ассоциированного пространства имен, и std::swap в любом случае оптимально для них на 99,9%. Поэтому объявление using std::swap; здесь кажется бесполезным.

11 голосов
/ 24 января 2011

Ключевое слово using имеет ограниченный эффект.

Это означает, что std::swap может упоминаться как swap во время действия ключевого слова using.

0 голосов
/ 08 февраля 2016

Краткий ответ

using std::swap; // allow ADL    /* <===== THE LINE I DONT UNDERSTAND */

необходимо, чтобы избежать рекурсивного вызова обмена участником. Смена участника отключает ADL.

...