A top-level const qualifier affects the object itself. Others are only
relevant with pointers and references. They do not make the object
const, and only prevent modification through a path using the pointer or
reference. Thus:
char x;
char const* p = &x;
This is not a top-level const, and none of the objects are immutable.
The expression *p
cannot be used to modify x
, but other expressions
can be; x
is not const. For that matter
*const_cast<char*>( p ) = 't'
is legal and well defined.
But
char const x = 't';
char const* p = &x;
This time, there is a top-level const on x
, so x
is immutable. No
expression is allowed to change it (even if const_cast
is used). The
compiler may put x
in read-only memory, and it may assume that the
value of x
never changes, regardless of what other code may do.
To give the pointer top-level const
, you'd write:
char x = 't';
char *const p = &x;
In this case, p
will point to x
forever; any attempt to change this
is undefined behavior (and the compiler may put p
in read-only memory,
or assume that *p
refers to x
, regardless of any other code).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…