una relaciones programacion orientada objetos miembros metodos entre ejemplos codigo clases clase c++ stl std using argument-dependent-lookup

programacion - relaciones entre clases c++



¿Qué significa `usar std:: swap` dentro del cuerpo de una implementación de método de clase? (3)

Durante la práctica de C ++, intenté aprender y adoptar el modismo de copia e intercambio después de esta explicación exhaustiva sobre esta pregunta: el modismo de copia e intercambio .

Pero encontré un código que nunca había visto: using std::swap; // allow ADL using std::swap; // allow ADL en este ejemplo

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. ¿Qué hace using std::swap; ¿Significa dentro del cuerpo de una función de implementación?
  2. ¿Qué significa ADL?

Este mecanismo se usa normalmente en el código con plantilla, es decir, la template <typename Value> class Foo .

Ahora la pregunta es qué swap usar. std::swap<Value> funcionará, pero puede que no sea lo ideal. Hay una buena posibilidad de que haya una mejor sobrecarga de swap para el tipo Value , pero ¿en qué espacio de nombres sería? Es casi seguro que no está en std:: (ya que eso es ilegal), pero muy probablemente en el espacio de nombres de Value . Probablemente, pero lejos de ser cierto.

En ese caso, swap(myValue, anotherValue) obtendrá el "mejor" intercambio posible. La búsqueda dependiente del argumento encontrará cualquier intercambio en el espacio de nombres de donde provino el Value . De lo contrario, la directiva de using activa y std::swap<Value> será instanciada y utilizada.

En su código, mSize es probablemente un tipo integral y mArray un puntero. Ninguno tiene un espacio de nombres asociado, y std::swap tiene una certeza óptima del 99.9% para ellos de todos modos. Por lo tanto, el using std::swap; La declaración parece inútil aquí.


La palabra clave de using tiene un efecto de ámbito.

Esto significa que se puede hacer referencia a std::swap como swap durante el alcance de la palabra clave using .


Respuesta corta

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

Necesario para evitar llamadas recursivas al intercambio de miembros. Intercambio de miembros deshabilita ADL.