传递args作为指针的引用与(no)constness给出不同的地址

时间:2011-11-29 17:48:35

标签: c++ pointers reference const

void f(char  *  & pch) {
    cout << &pch << " " << pch << endl;
}

int main() {
    char *pch2 = new char[11];
    strcpy(pch2, "1234567890");
    cout << &pch2 << " " << pch2 << endl;
    f(pch2);

    return 0;
}

给出下一个输出:

0xbfa0d62c 1234567890 
0xbfa0d62c 1234567890

但如果我按如下方式修改第一行

void f(char const * const & pch) {

我会得到:

0xbfec7df8 1234567890
0xbfec7dfc 1234567890
由于需要将新的内存单元标记为const或其他东西,

是否出现指针差异?

2 个答案:

答案 0 :(得分:5)

pch2char*,而不是char const*。您不能将char const*&类型的引用绑定到类型char*的指针,因此以下内容将是格式错误的:

char* p(0);
char const*& r(p);

同样,如果您的函数声明为void f(char const*& pch),由于const限定符不匹配,您将无法使用char*参数调用它。

你的例子工作的原因是const引用可以绑定到临时,并且编译器可以构造你的char*指针的临时副本,给临时类型char const*,并绑定对该临时指针的引用pch

答案 1 :(得分:2)

在第一种情况下,参数与函数的参数完全匹配,因此可以直接绑定到参考。

在第二种情况下,类型是不同的(稍微),因此编译器会创建一个传递给函数的临时类型。