[basic.type.qualifier] (original) (raw)
6 Basics [basic]
6.8 Types [basic.types]
6.8.4 CV-qualifiers [basic.type.qualifier]
Each type which is a cv-unqualified object type or isvoid ([basic.types]) has three corresponding cv-qualified versions of its type: a const-qualified version, avolatile-qualified version, and aconst-volatile-qualified version.
- A const object is an object of type const T or a non-mutable subobject of a const object.
- A volatile object is an object of typevolatile T or a subobject of a volatile object.
- A const volatile object is an object of typeconst volatile T, a non-mutable subobject of a const volatile object, a const subobject of a volatile object, or a non-mutable volatile subobject of a const object.
The cv-qualified or cv-unqualified versions of a type are distinct types; however, they shall have the same representation and alignment requirements ([basic.align]).47
Except for array types, a compound type ([basic.compound]) is not cv-qualified by the cv-qualifiers (if any) of the types from which it is compounded.
An array type whose elements are cv-qualified is also considered to have the same cv-qualifications as its elements.
[Note 1:
Cv-qualifiers applied to an array type attach to the underlying element type, so the notation “cv T”, where T is an array type, refers to an array whose elements are so-qualified ([dcl.array]).
— _end note_]
[Example 1: typedef char CA[5];typedef const char CC; CC arr1[5] = { 0 };const CA arr2 = { 0 };
The type of both arr1 and arr2 is “array of 5const char”, and the array type is considered to be const-qualified.
— _end example_]
There is a partial ordering on cv-qualifiers, so that a type can be said to be more cv-qualified than another.
Table 13 shows the relations that constitute this ordering.
Table 13: Relations on const and volatile [tab:basic.type.qualifier.rel]
| 🔗 | no cv-qualifier | < | const |
|---|---|---|---|
| 🔗 | no cv-qualifier | < | volatile |
| 🔗 | no cv-qualifier | < | const volatile |
| 🔗 | const | < | const volatile |
| 🔗 | volatile | < | const volatile |
In this document, the notation cv (or_cv1_, cv2, etc.)
, used in the description of types, represents an arbitrary set of cv-qualifiers, i.e., one of {const}, {volatile}, {const,volatile}, or the empty set.
For a type cv T, the top-level cv-qualifiersof that type are those denoted by cv.
[Example 2:
The type corresponding to the type-id const int&has no top-level cv-qualifiers.
The type corresponding to the type-id volatile int * consthas the top-level cv-qualifier const.
For a class type C, the type corresponding to the type-id void (C::* volatile)(int) consthas the top-level cv-qualifier volatile.
— _end example_]