В C ++, если «int a = 3; int * p = & a;», то почему «const int * & pp = p» не разрешено, а «const int * const & pp = p» разрешено? - PullRequest
0 голосов
/ 10 сентября 2018

В C ++, если:

int a = 3; 
int* p = &a; 

тогда почему

const int* &pp = p; 

не разрешено, но

const int* const &pp = p; 

разрешено?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

когда const слева *, модификатор const точка dest, когда const справа * point, точка модификатора const, и вы спрашиваете, addr локального var shoule будет const.

0 голосов
/ 10 сентября 2018

Причина, по которой первое преобразование не разрешено, заключается в том, что оно (тонко и неинтуитивно) нарушает правильность const. Здесь обсуждается . Короче проблема в следующем:

const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;

Если бы третья строка была действительной, четвертая строка установила бы p для указания на x (потому что *q равно p), поэтому *p = 3 изменит x, даже если x const.

Та же проблема возникает, когда модификатор верхнего уровня является ссылкой, а не указателем.

При изменении квалификаторов const в многослойных типах указателей вы должны делать все или ничего.

0 голосов
/ 10 сентября 2018

Учитывая const int* &pp = p;, p сначала нужно неявно преобразовать в const int*. Но преобразованный const int* является временным, который не может быть привязан к lvalue-ссылке на non-const (как const int* &).

Временный может быть привязан к lvalue-reference к const (например, const int* const &) (и rvalue-reference), поэтому const int* const &pp = p; работает нормально. И время жизни временного объекта увеличивается до времени жизни ссылки pp.

...