具有参数int&
的函数如何处理int**
类型的变量?
例如,我有常规的交换函数,当我从一个指针数组传递变量时,它可以工作。它怎么会导致类型不匹配错误?因为互换只能收到int
而不是int**
。
void swap(int& a, int& b);
const int SIZE = 6;
int main(){
int arr[SIZE] = { 1, 2, 3, 4, 5, 6 };
int*pointers[SIZE];
int i;
for (i = 0; i<SIZE; i++)
pointers[i] = &arr[i];
for (i = 0; i < SIZE; i++)
swap(pointers[i], pointers[i + 1]);
}
void swap(int& a, int& b){
int t;
t = a;
a = b;
b = t;
}
答案 0 :(得分:2)
标准中已有一个名为swap
的函数,它位于namespace std
中,并为所有内容定义:
// simplification
namespace std {
template <typename T>
void swap(T&, T&) { .. }
}
您提供自己的版本,因为它位于不同的命名空间(并且不是模板),所以不会发生冲突:
void swap(int&, int&) { .. }
通常情况下,没有争用,发生的事情会很明显:
swap(i1, i2); // fine, calls yours
std::swap(c1, c2); // fine, calls std::swap<char>
swap(c1, c2); // error: can't convert char to int&
swap(pointers[i], pointers[i+1]); // error: can't convert int* to int&
但是在代码的某处,你有:
using namespace std;
这会将std::swap
引入全局命名空间 - 现在您的swap
只会充当该int&
的重载 - 这是swap(i1, i2); // fine, calls yours
swap(c1, c2); // fine, calls std::swap<char>
swap(pointers[i], pointers[i+1]); // fine, calls std::swap<int*>
的首选:
int*
这就是为什么它有效。不是以某种方式你以某种方式允许int&
被转换为using namespace std;
- 这就是你默默地称你的功能与你认为的完全不同。故事的道德:避免{{1}} - 它会让你的代码做得更清楚。