带有参数 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; - 它会让你的代码做的事情更加清晰。