[basic.type.qualifier] (original) (raw)

6 Basics [basic]

6.8 Types [basic.types]

6.8.5 CV-qualifiers [basic.type.qualifier]

Each type other than a function or reference type is part of a group of four distinct, but related, types: a cv-unqualified version, a const-qualified version, a volatile-qualified version, and a const-volatile-qualified version.

The types in each such group shall have the same representation and alignment requirements ([basic.align]).34

A function or reference type is always cv-unqualified.

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 2:

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 16 shows the relations that constitute this ordering.

Table 16 — 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_]