为何向形参为指针的swap函数传入普通变量时代码仍可编译?
问题原因分析
- 核心原因是你调用的根本不是自己定义的
swap(int *a, int *b)函数,而是C++标准库提供的std::swap模板函数
具体细节解释
- 你代码开头写了
using namespace std;,会把std命名空间下的所有名称引入全局作用域 - C++标准库的
<iostream>头文件(或者其间接引入的其他标准头文件)内置了模板函数template< class T > void swap(T& a, T& b),作用是交换两个T类型变量的值,接受的是左值引用参数,刚好可以匹配你传入的两个int类型普通变量,编译器会优先选择这个参数完全匹配的重载版本,而不是你写的需要做指针转换的版本 - 你自己实现的
swap函数存在逻辑错误:就算你手动传入&x和&y调用它,也无法完成值交换——函数内部交换的是指针形参的本地副本,不会影响外部实参的指针指向,更不会修改指针指向的内存的值
验证方法
你可以做以下任意一种修改,就能触发参数不匹配的编译报错,证明你原本的调用没有用到自定义的swap:
- 删除代码开头的
using namespace std;语句 - 将swap调用改为
::swap(x,y),强制指定调用全局作用域下的函数
内容的提问来源于stack exchange,提问作者praful h y
相关产品推荐
相关产品推荐

