2011-08-11 11 views
11

La plantilla de función swap se movió de <algorithm> a <utility> en C++ 0x. ¿El primero incluye el último en C++ 0x? ¿O ambos incluyen un encabezado común que define swap?¿Se seguirá definiendo std :: swap incluyendo algoritmo en C++ 0x?

En otras palabras, ¿se garantiza la compilación del código siguiente en C++ 0x?

#include <algorithm> // will this pull in std::swap? 

// ... 

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

Respuesta

15

El FDIS (n3290), en el Anexo C, "Compatibilidad", C.2.7 dice:

17.6.3.2

E ff ect en función original: El intercambio de funciones se trasladaron a un Erent di ff encabezado

Justificación: Eliminar la dependencia del algoritmo < > para el intercambio.

E ff efecto sobre rasgo original: Válido código C++ 2003 que se ha compilado esperando de intercambio de estar en <algoritmo> puede tener que incluir en su lugar <utilidad>.

Así que no, no está garantizado para compilar, esto es intencionadamente un cambio de rotura. Si las implementaciones individuales realmente romperán el código C++ 03 es otra cuestión. Como usted señala, es bastante fácil para ellos no hacerlo, definiendo swap a través de cualquier encabezado. Pero hay una opción entre hacer que sea más fácil portar el código C++ 03 a C++ 0x, o ayudar a las personas a escribir C++ 0x estrictamente conforme.

+0

¿Por qué 'std :: swap' no siempre ha estado dentro de' '? :) – fredoverflow

+1

El comité estaba dormido al volante en este caso. Muchos de los algoritmos en '' usan 'swap', por lo que deben estar dentro del alcance. Deberíamos haber garantizado que '' aún tira en 'swap', porque en la práctica * siempre * lo hará. P.ej. 'int i, j; std :: iter_swap (& i, &j); '* tiene * para funcionar! –

+0

@Howard: y es correcto que una vez que los tipos definidos por el usuario se pongan en juego, * debe * ser el' real ''std :: swap' utilizado por esos algoritmos, no solo por algún otro código que tenga el efecto de intercambiar los valores, porque el usuario podría especializar 'std :: swap' y los algoritmos deben usar la especialización? –