带有参数 int& 的函数怎么可能处理 int** 类型的变量?
How is it possible for a function with an argument int& to handle a variable of a type int**?
带有参数 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;
}
标准中已经有一个名为 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&
:[=23= 的首选]
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;
- 它会让你的代码做的事情更加清晰。
带有参数 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;
}
标准中已经有一个名为 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&
:[=23= 的首选]
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;
- 它会让你的代码做的事情更加清晰。