Почему автоматический спецификатор выводит const уровня "top and low" из указателя &? - PullRequest
0 голосов
/ 17 мая 2018

Мой код

    const int *const ptrA = nullptr;
    auto *ptrB = &ptrA; 

Мое восприятие от const int *const ptrA:

  • (*const) - это "const верхнего уровня"
  • (const int) - это «низкоуровневая константа»

Итак, ptrB должен иметь тип const int**.

Мой вопрос ...

Почему ptrB не является const int** типом, если "const верхнего уровня" игнорируется?

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Почему ptrB не является const int** типом, если "верхний уровень const" игнорируется?

Это будет игнорироваться, если вы используете:

auto *ptrB = ptrA; 

Тогда ptrB будет иметь тип const int*.

Однако верхний уровень const не игнорируется при использовании адреса оператора.

Относительно

Итак, ptrB должно быть const int** типа.

Нет, оно типа const int* const*.Будет легче читать, если тип указан как int const* const*.ptrB - указатель на const указатель на const int.

0 голосов
/ 17 мая 2018

Таким образом, для auto *ptrB = ptrA; ваше восприятие будет правильным (в результате auto = const int*, тогда как ptrA равно const int* const),

, но тип &ptrA равен const int *const*, нет const, чтобы бросить.

0 голосов
/ 17 мая 2018

ptrB имеет тип const int* const*.

ptrA само является const, указывает на const int.Вы получаете его адрес, таким образом ptrB указывает на указатель const на const int.

0 голосов
/ 17 мая 2018

Верхний уровень const действительно игнорируется при выводе аргументов шаблона (как volatile), но у вас нет нет никакого квалификатора константы верхнего уровня!

Выиметь &ptrA, который является указателем на const int *const, поэтому const int *const*.Больше нет верхнего уровня const.Вот почему ptrB имеет тип const int *const*.

Если у вас было auto ptrB = ptrA;тогда да, верхний уровень const будет игнорироваться.

...