Двойная константная декларация - PullRequest
11 голосов
/ 28 января 2010

Я часто вижу следующее объявление функции:

some_func(const unsigned char * const buffer)
{

}

Есть идеи, почему const повторяется перед именем указателя?

Спасибо.

Ответы [ 8 ]

20 голосов
/ 28 января 2010

Первый констант говорит, что данные, на которые указывает, является постоянным и не может быть изменен, второй говорит, что сам указатель не может быть изменен:

char my_char = 'z';
const char* a = &my_char;
char* const b = &my_char;
const char* const c = &my_char;

a = &other_char; //fine
*a = 'c'; //error
b = &other_char; //error
*b = 'c'; //fine
c = &other_char; //error
*c = 'c'; //error
8 голосов
/ 28 января 2010

объявления типов должны (?) Читаться как RTL. const изменяет объект слева, но правило усложняется тем, что вы можете написать и const T, и T const (они означают одно и то же).

  • T * const является константным указателем на изменяемый T
  • T & const будет константной ссылкой на изменяемый T , за исключением того, что ссылки постоянны по определению
  • T const * является изменяемым указателем на постоянную T
  • T const & является ссылкой на постоянную T
  • T const * const - это постоянный указатель на постоянную T
3 голосов
/ 28 января 2010

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

Вы можете прочитать объявление от объекта, объявленного наружу, поэтому const unsigned char * const buffer читается как: "буфер является константным указателем на символ const без знака" (вот почему const всегда должен быть помещен после что он изменяет - с ним раньше вы должны переставлять вещи, чтобы составить предложение - с этим объявленным как unsigned char const * const buffer, перевод на английский язык прост и понятен (или, возможно, "прямолинейен", так как вы на самом деле читаете из справа налево в этом случае).

3 голосов
/ 28 января 2010

Это постоянный указатель на постоянный беззнаковый символ. Вы не можете изменить указатель или объект, на который он указывает.

2 голосов
/ 28 января 2010

при условии, что const unsigned char * const

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

Типы C ++ читаются в основном справа налево , если в дальнем левом углу нет модификаторов, тогда они читаются слева направо.

1 голос
/ 28 января 2010

Несколько статей, которые помогут вам понять правильность констант в C ++:

1 голос
/ 28 января 2010

const * unsigned char const buffer означает, что вы не можете изменить указатель buffer или память, на которую указывает buffer.

1 голос
/ 28 января 2010

Это делает его константным указателем на константное значение, а не изменяемым указателем на константное значение или константным указателем на изменяемое значение.

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