Сокрытие имени с помощью объявления

#include <iostream>

struct H
{
    void swap(H &rhs); 
};    

void swap(H &, H &)
{
    std::cout << "swap(H &t1, H &t2)" << std::endl;
}

void H::swap(H &rhs)
{
    using std::swap;
    swap(*this, rhs);
}


int main(void)
{
    H a;
    H b;

    a.swap(b);
}

И вот результат:

swap(H &t1, H &t2)

В приведенном выше коде я пытаюсь определить функцию подкачкиH, В функцииvoid H::swap(H &rhs)Я использую объявление использования, чтобы сделать имя std :: swap видимым. Если нет объявления об использовании, код не может быть скомпилирован, потому что в классе нет полезной функции подкачки с двумя параметрамиH.

У меня есть вопрос здесь. На мой взгляд, после того, как я использовал объявление об использовании -using std::swapэто просто делает std :: swap - функцию шаблона в STL видимой. Поэтому я подумал, что своп в STL должен быть вызван вH::swap(), Но результат показал, чтоvoid swap(H &t1, H &t2) был вызван вместо

Вот мой вопрос:

Почему я не могу вызвать swap без объявления использования I (я думаю, это потому, что в классе нет функции swap с двумя параметрами. Но я не уверен.)Почему будет использоваться обмен моего определения вместо обмена STL вH::swap?

Ответы на вопрос(1)

Ваш ответ на вопрос