c++ templates namespaces swap argument-dependent-lookup

c++ - ¿Cuál es el punto de iter_swap?



templates namespaces (2)

De los documentos de SGI ( here ):

[1] Estrictamente hablando, iter_swap es redundante. Existe solo por razones técnicas: en algunas circunstancias, algunos compiladores tienen dificultades para realizar la deducción de tipo requerida para interpretar swap (* a, * b).

Me preguntaba, ¿por qué alguien escribiría esto?

std::iter_swap(i, k);

¿en lugar de esto?

std::swap(*i, *k); // saved a few keystrokes!

Luego iter_swap la implementación de iter_swap y, por supuesto, solo usa swap lugar de std::swap ya que de todos modos ya estamos en el namespace std de namespace std . Eso me lleva a la siguiente pregunta:

¿Por qué alguien escribiría esto?

using std::swap; swap(a, b);

¿en lugar de esto?

std::iter_swap(&a, &b); // saved an entire line of code!

¿Hay alguna diferencia / problema importante que estoy pasando por alto aquí?


Para responder a su segunda pregunta, el using + swap permite al compilador usar funciones de intercambio definidas por el usuario que pueden ser más eficientes que la implementación predeterminada (mediante el uso de ADL). Explicar explícitamente que std::swap inhibe ADL y cualquier método de intercambio personalizado que haya podido encontrar.

En cuanto a iter_swap es de suponer que debe usarse en plantillas e indicar claramente intención en lugar de un intercambio que podría indicar que espera un puntero.