Как происходит конвертация квалификации? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть пример:

int i = 1;
const int *b = &i;

В данном случае я не понимаю, Когда адрес i преобразуется в указатель на const int. Разве i не преобразуется в целое число const при преобразовании квалификации? что именно происходит под капотом, когда применяется преобразование квалификации?

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Ничего не происходит под капотом. const является строго компилируемым объектом времени. компилятор использует только знания const, чтобы решить, является ли инструкция ошибкой, а не для генерации кода. при этом следующее:

int i = 1;
const int *b = &i;

эквивалентно

int i = 1;
int *b = &i;

в терминах сгенерированного кода. Однако, если вы делаете следующее:

int i = 1;
const int *b = &i;
*b = 1;

компилятор заметит, что b имеет const (хотя он ничего не знает о i) и выдаст ошибку. Однако любой оператор, который не считается ошибкой с добавленным const, будет генерировать один и тот же код с или без const.

1 голос
/ 08 декабря 2011

адрес i преобразуется в указатель на const int

Нет .&i по-прежнему является адресом int (не const int).Под капотом int* неявно преобразуется в const int*.Таким образом, *b нельзя изменить, однако i все еще можно изменить.

Кроме того, подумайте иначе: если ваше предположение верно, то следующее даст ошибку компилятора, но это не так:

int i = 1;
const int *b = &i;
int *c = &i; // perfectly valid !
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...