c++ - 为什么这个程序要交换值?

标签 c++ swap argument-dependent-lookup name-lookup

我有以下代码:

#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)

最佳答案

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

您包含的其中一个标准库正在拉入 <utility> , 它声明了一个名为 swap 的函数模板在std命名空间。既然你是using namespace std; , 那swap函数被带入全局命名空间并被调用。


为什么是std::swap选择而不是你的 swap功能?你的swap函数需要两个 long按值(value)计算;要调用该函数,每个 int 都需要整数提升争论。

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


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

关于c++ - 为什么这个程序要交换值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919300/

相关文章:

c++ - getline() 函数从何而来?

c++ - 类(模板)成员函数体内的 ADL 查找

c++ - 如何从1000个潜在关键字中确定给定关键字?

c++ - 链表/vector 中的指针

c - 为什么人们不使用异或交换?

C 用双向链表交换

haskell - Haskell 中的交换函数

c++ - 模板库中的名称查找 : why do we add this->

c++ - 在 Visual Studio 2012 中创建一个空项目后,某些文件有什么作用?

c++ - 排序列表 - 最好的方法