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