проблемы с константными параметрами - PullRequest
3 голосов
/ 07 апреля 2011
#include <iostream>

void f(const  int * & p)
{
    int i =0;
    i = p[0];
    std::cout << i << std::endl;
}

int main()
{
    int * p =new int[1];
    p[0] =102;
    f(p);
    return 1;
}

Компилятор gcc выдает ошибку для этого кода:

prog.cpp: In function ‘int main()’:
prog.cpp:16: error: invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’
prog.cpp:5: error: in passing argument 1 of ‘void f(const int*&)’

Но если я изменю функцию "f" на

void f(const  int * const & p)

Все хорошо. Может кто-нибудь объяснить, почему const ведет себя так? спасибо.

Ответы [ 2 ]

10 голосов
/ 07 апреля 2011

Переход от int* к const int* требует создания временного указателя const int* и привязки ссылки const int*& к этому временному.

Стандарт запрещает создавать временные ссылки на неконстантные ссылки.Для этого вам нужно сделать ссылку константой, как вы сделали свое исправление.

Это связано с тем, что неконстантные ссылки означают «Я хочу изменить аргумент, передаваемый вызывающей стороной, используя этот параметр ссылки».Но если вызывающая сторона должна преобразовать свой аргумент и в конечном итоге передать временное значение, точка ссылки не имеет смысла, и поэтому стандарт считает ошибкой пытаться передать временное значение.

1 голос
/ 07 апреля 2011

Если бы было разрешено первое преобразование (int * в const int * &), то вы могли бы написать злую функцию, подобную этой:

const int really_const[] = {1,2,3};

void evil(const int * & p)
{
    p = really_const;
}

int main()
{
    int not_const[3];
    int * p = not_const;
    evil(p);
    p[0] = 0;  // Whoops: modifying a const object
}

Второе преобразование в порядке, поскольку оно не позволяет функции изменять указатель таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...