Что означает `const T * const`? - PullRequest
6 голосов
/ 26 ноября 2011

Я читал пример шаблона C ++, и часть подписи шаблона смутила меня.

Правильно ли я читаю это:

const T* const foo;

Is foo a const* toconst T?

Ответы [ 8 ]

9 голосов
/ 26 ноября 2011

Да, это постоянный указатель на константу T. То есть вы не можете ни изменить указатель, ни то, на что он указывает.

const T* только запрещает вам изменять что-либо, на что указывает указатель, но позволяет вам (в пределах языка) проверять значение в *(foo+1) и *(foo-1). Используйте эту форму, когда вы передаете указатели на неизменяемые массивы (такие как строка C, которую вы только должны читать).

T * const означает, что вы можете изменить значение T, на которое указывает foo, но вы не можете изменить сам указатель; поэтому вы не можете сказать foo++; (*foo)++, потому что первый оператор будет увеличивать (изменять) указатель.

T * даст вам полную свободу: вы получаете указатель на массив и можете проверять и изменять любой член этого массива.

2 голосов
/ 26 ноября 2011

Да; это именно то, что это значит.

Поскольку при использовании указателей всегда есть небольшая путаница в отношении const, существуют следующие возможности:

  • const T * aConstant

    означает, что aConstant является указателем переменной на constant T.

  • T const * aConstant

    делает то же самое.

  • T * const aConstant

    объявляет, что aConstant является константным указателем на variable T и.

  • T const * const aConstant (или const T * const aConstant)

    объявляет константный указатель в constant T.

1 голос
/ 26 ноября 2011

Это константный указатель на const T. Так что, если T был int, то массив является указателем на int, который является const двумя способами:

pointer-to-const: значениеУказатель, на который указывает указатель, не может быть изменен (или указывает на const int). Указатель const: адрес памяти, сохраненный в указателе, не может измениться

Это также совпадает с T const * const array

См. вики о правильности констант .

1 голос
/ 26 ноября 2011

Да, foo - это постоянный указатель на постоянную T.

0 голосов
/ 01 марта 2019

просто разобрать это так

const<ptr<const<T>>> foo

хотя это незаконно, но я думаю, что каждый может понять его суть.

0 голосов
/ 26 ноября 2011

Да, это просто означает, что вы не только не можете изменить то, на что указывает foo, но вы также не можете изменить само значение foo, чтобы оно указывало на какой-то другой экземпляр T.

0 голосов
/ 26 ноября 2011

Да.


const T*

делает элементы массива const ... по крайней мере, что касается foo.

foo[0] = T(); // Illegal!
foo[1] = T(); // Illegal!
foo[2] = whatever; // Illegal!

const

делает foo постоянным указателем. Следовательно, это незаконно:

foo = &some_array;

Переменная

foo

... если вы не знаете, что это такое, вам следует серьезно подумать о том, чтобы пойти в дошкольное учреждение.

0 голосов
/ 26 ноября 2011

Да, я думаю, что имя var (const) спотыкается.

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