Подтвердить что ты не робот

Что означает "использование std:: swap" внутри тела метода класса?

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

Но я нашел код, которого я никогда не видел: 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
    }
};
  • что означает using std::swap; внутри тела функции реализация?
  • Что означает ADL?
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Ключевое слово using имеет эффект с областью.

Это означает, что std::swap можно назвать swap в рамках ключевого слова using.

Ответ 3

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

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

чтобы избежать рекурсивного вызова элемента обмена. Пользовательский своп отключает ADL.