具有参数int&的函数怎么可能?处理int **类型的变量?

时间:2015-01-12 14:41:55

标签: c++ pointers syntax

具有参数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;
}

1 个答案:

答案 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}} - 它会让你的代码做得更清楚。