адрес константного объекта, интерпретируемого как константа низкого уровня - PullRequest
1 голос
/ 12 июля 2020

В C ++ Primer (5-е издание) я нашел пример, который не имеет для меня особого смысла:

const int i = /*some integer literal*/;

auto e = &i; 

Для меня &i представляет собой адрес const int i - поэтому сам адрес не является константой (низкий / высокий уровень), и e следует интерпретировать как int *.

Но эта книга интерпретирует e как const int * с указанием причины (& для константного объекта является константой низкого уровня) - Кто-нибудь, пожалуйста, поясните, что не так с моим пониманием.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Из книги C ++ Primer 5th Edition:

..., указатель - это объект, который может указывать на другой объект. В результате мы можем независимо говорить о том, является ли указатель константным и являются ли объекты, на которые он может указывать, константами. Мы используем термин константа верхнего уровня, чтобы указать, что сам указатель является константой. Когда указатель может указывать на константный объект, мы называем эту константу константой низкого уровня.

В более общем смысле константа верхнего уровня указывает, что сам объект является константой. Константа верхнего уровня может присутствовать в любом типе объекта, т. Е. В одном из встроенных типов arithmeti c, типе класса или типе указателя. Константа низкого уровня появляется в базовом типе составных типов, таких как указатели или ссылки. Обратите внимание, что типы указателей, в отличие от большинства других типов, могут иметь константу верхнего и нижнего уровня независимо:

int i = 0;
int *const p1 = &i; // we can't change the value of p1; const is top-level
const int ci = 42; // we cannot change ci; const is top-level
const int *p2 = &ci; // we can change p2; const is low-level
const int *const p3 = p2; // right-most const is top-level, left-most is not
const int &r = ci; // const in reference types is always low-level

Надеюсь, это поможет лучше понять.

0 голосов
/ 12 июля 2020

Вы назначаете адрес e, используя auto, поэтому e является указателем. Константа const применяется к int, e указывает на const int, но e не является указателем const. e был бы константой верхнего уровня, если бы e был константным указателем, а это не константный указатель (ie вы можете назначить другие адреса для e), который указывает на const int. Следовательно, e является константой низкого уровня

int i = /*some integer literal*/;

const auto e = &i; 

Теперь e - это константный указатель на не const int. Поскольку сам объект e является константой, это константа верхнего уровня

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