передача аргументов как ссылки на указатель с (без) константности дает разные адреса - PullRequest
4 голосов
/ 29 ноября 2011
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 ]

5 голосов
/ 29 ноября 2011

pch2 - это char*, а не char const*. Вы не можете привязать ссылку типа char const*& к указателю типа char*, поэтому следующее будет неправильно сформировано:

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

Аналогично, если бы ваша функция была объявлена ​​как void f(char const*& pch), вы не смогли бы вызвать ее с аргументом char* из-за несоответствия const-qualifier.

Причина того, что ваш пример работает, заключается в том, что константная ссылка может связываться с временной, а компилятор может создать временную копию вашего указателя char*, присвоить этому временному типу char const* и связать ссылку pch к этому временному указателю.

2 голосов
/ 29 ноября 2011

В первом случае параметр является точным соответствием параметру функции, поэтому его можно привязать непосредственно к ссылке.

Во втором случае типы различаются (незначительно), поэтому компилятор создаетвременный, который передается в функцию.

...