10

我有以下代码:

#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;
}

程序给出输出:

5 3

3 5

该程序实际上交换了值!这是为什么?的参数swap()不是指针或引用。

(我正在使用 VS 2005)

4

2 回答 2

37

您的swap函数根本没有被调用。

您包含的标准库之一是 pull in <utility>,它声明了一个swap在命名空间中std命名的函数模板。由于您是using namespace std;,因此该swap函数被带入全局命名空间并被调用。


为什么std::swap选择而不是你的swap功能?您的swap函数long按值取两个;要调用该函数,每个参数都需要一个整数提升int

std::swap是一个函数模板。它需要对 的两个引用T,并且当使用 实例化该函数模板时T = int,两个参数都是完全匹配的。因此,std::swap它比您的函数更匹配,因此在重载解析期间选择它。


using namespace std;是邪恶的原因之一,应该避免。如果您删除 using 指令,您的函数将是唯一可用的函数,并且将被调用。

于 2011-05-07T05:24:29.227 回答
1

long而不是int

您当前的代码已经更好地匹配swap,因此它避免了隐式转换为,而是使用STLlong中的内置代码。swap

附带说明一下,使用语言 D 中的重载集(也在此处)在一定程度上解决了这种歧义。

于 2011-05-07T05:25:19.057 回答