开发者

Double const declaration

开发者 https://www.devze.com 2022-12-18 14:03 出处:网络
I often see the following function declaration: some_func(const unsigned char * const buffer) { } Any idea why the const is repeated before the pointer name?开发者_JS百科

I often see the following function declaration:

some_func(const unsigned char * const buffer)
{

}

Any idea why the const is repeated before the pointer name?

开发者_JS百科

Thanks.


The first const says that the data pointed to is constant and may not be changed whereas the second const says that the pointer itself may not be changed:

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


type declarations should(?) be read RTL. const modifies the thing on its left, but the rule is complicated by the fact that you can write both const T and T const (they mean the same thing).

  • T * const is a constant pointer to mutable T
  • T & const would be constant reference to mutable T, except references are constant by definition
  • T const * is a mutable pointer to constant T
  • T const & is a reference to constant T
  • T const * const is constant pointer to constant T


It's a constant pointer to a constant unsigned char. You can't change the pointer nor the thing it points to.


In a declaration like const * const T, the first const (before the *) means that what the pointer points at is const (i.e. it's a pointer to a const T). The const after the * means that the pointer itself is const (i.e. can't be modified to point at anything else).

You can read the declaration from the object being declared outward, so const unsigned char * const buffer is read as: "buffer is a const pointer to a const unsigned char" (this is why const should always being placed after what it modifies--with it before, you have to rearrange things to make the sentence--with it declared as unsigned char const * const buffer, translation to English is simple and straighforward (or perhaps "straightbackward", since you actually read from right to left in this case).


assuming const unsigned char * const

Everyone is correct that its a const pointer to a const unsigned char.

C++ types read mostly right to left unless there are any modifiers on the far left then these read left to right.


This makes it a const pointer to a const value, rather than a mutable pointer to a const value or a const pointer to a mutable value.


const * unsigned char const buffer means that you cannot modify the pointer buffer nor the memory that buffer points to.


A couple of articles to help you understand const correctness in C++:

  • Wikipedia
  • Possibility.com
0

精彩评论

暂无评论...
验证码 换一张
取 消