Ocultar nombre usando declaración

#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);
}

Y este es el resultado:

swap(H &t1, H &t2)

En el código anterior, trato de definir una función de intercambio deH. En la funciónvoid H::swap(H &rhs), Uso una declaración de uso para hacer visible el nombre std :: swap. Si no hay una declaración de uso, el código no se puede compilar porque no hay una función de intercambio utilizable con dos parámetros en claseH.

Tengo una pregunta aqui. En mi opinión, después de usar la declaración de uso:using std::swap, solo hace que std :: swap - la función de plantilla en STL sea visible. Entonces pensé que el intercambio en STL debería invocarse enH::swap(). Pero el resultado mostró que elvoid swap(H &t1, H &t2) fue invocado en su lugar.

Ésta es mi pregunta:

¿Por qué no puedo invocar el intercambio sin una declaración de uso? (supongo que es porque no hay una función de intercambio con dos parámetros en la clase. Pero no estoy seguro).¿Por qué se invocará el intercambio de mi definición en lugar del intercambio de STL en elH::swap?

Respuestas a la pregunta(1)

Su respuesta a la pregunta