2011-05-07 26 views
10

Tengo el siguiente código:¿Por qué este programa intercambia los valores?

#include "stdafx.h" 
#include <iostream> 
using namespace std; 
#include <conio.h> 
#include <cstring> 
#include <iomanip> 

void swap(long a, long b) 
{ 
    long temp; 

    temp=a; 
    a=b; 
    b=temp; 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int x = 5, y = 3; 
    cout << x ; 
    cout << y << endl; 

    swap(x, y); 

    cout << x ; 
    cout << y << endl; 

    getch(); 
    return 0; 
} 

El programa da la salida:

5 3 

3 5 

El programa realmente intercambia los valores! ¿Porqué es eso? Los parámetros del swap() no son punteros ni referencias.

(estoy usando VS 2005)

+0

Básicamente, se trata de una víctima de http://stackoverflow.com/questions/2712076/how-to -use-iterator-in-c/2712125 # 2712125, aunque no sabría esto a menos que sepa la respuesta. – sbi

Respuesta

37

Su función swap no se está llamando a todos.

una de las bibliotecas estándar incluye que ha incluido está tirando en <utility>, que declara una plantilla de función llamada swap en el espacio de nombres std. Dado que es using namespace std;, esa función swap se está llevando al espacio de nombres global y se llama en su lugar.


¿Por qué se std::swap elegido en lugar de su función swap? Su función swap toma dos long s por valor; para llamar a esa función, se requiere una promoción de entero para cada uno de los argumentos int.

std::swap es una plantilla de función. Se necesitan dos referencias a T, y cuando esa plantilla de función se crea una instancia con T = int, ambos argumentos son una coincidencia exacta. Por lo tanto, std::swap es una mejor coincidencia que su función y, por lo tanto, se selecciona durante la resolución de sobrecarga.


Esta es una razón por la que using namespace std; es malo y debe evitarse. Si elimina la directiva de uso, su función será la única función disponible y se llamará.

+7

Puedes llamarte swap() por :: swap (x, y) –

+3

Tricky. Muy engañoso. – Maxpm

1

Diga long en lugar de int.

su código actual ya tiene una mejor coincidencia para swap, por lo que evita la conversión implícita a long, y en su lugar utiliza el incorporado en swap de la STL.

En una nota lateral, esta ambigüedad se resuelve mediante un tanto overload sets (también here) en el lenguaje D.

Cuestiones relacionadas