Files
cppdraft_translate/cppdraft/conv/qual.md
2025-10-25 03:02:53 +03:00

4.3 KiB
Raw Blame History

[conv.qual]

7 Expressions [expr]

7.3 Standard conversions [conv]

7.3.6 Qualification conversions [conv.qual]

1

#

A qualification-decomposition of a type T is a sequence ofcvi and Pi such that T is “cv0 P0 cv1 P1 ⋯ cvn−1 Pn−1 cvn U” for n ≥ 0, where each cvi is a set of cv-qualifiers ([basic.type.qualifier]), and each Pi is “pointer to” ([dcl.ptr]), “pointer to member of class Ci of type” ([dcl.mptr]), “array of Ni”, or “array of unknown bound of” ([dcl.array]).

If Pi designates an array, the cv-qualifiers cvi+1 on the element type are also taken as the cv-qualifiers cvi of the array.

[Example 1:

The type denoted by the type-id const int ** has three qualification-decompositions, taking U as “int”, as “pointer to const int”, and as “pointer to pointer to const int”.

— end example]

2

#

Two types T1 and T2 are similar if they have qualification-decompositions with the same n such that corresponding Pi components are either the same or one is “array of Ni” and the other is “array of unknown bound of”, and the types denoted by U are the same.

3

#

The qualification-combined type of two types T1 and T2 is the type T3 similar to T1 whose qualification-decomposition is such that:

for every i>0, cv3i is the union ofcv1i and cv2i,

if either P1i or P2i is “array of unknown bound of”,P3i is “array of unknown bound of”, otherwise it is P1i, and

if the resulting cv3i is different from cv1i or cv2i, or the resulting P3i is different from P1i or P2i, then const is added to every cv3k for 0<k<i,

where cvji and Pji are the components of the qualification-decomposition of Tj.

A prvalue of type T1 can be converted to type T2 if the qualification-combined type of T1 and T2 is T2.

[Note 1:

If a program could assign a pointer of type T** to a pointer of type const T** (that is, if line #1 below were allowed), a program could inadvertently modify a const object (as it is done on line #2).

For example,int main() {const char c = 'c';char* pc;const char** pcc = &pc; // #1: not allowed*pcc = &c;*pc = 'C'; // #2: modifies a const object}

— end note]

[Note 2:

Given similar types T1 and T2, this construction ensures that both can be converted to the qualification-combined type of T1 and T2.

— end note]

4

#

[Note 3:

A prvalue of type “pointer to cv1€ can be converted to a prvalue of type “pointer to cv2€ if “cv2€ is more cv-qualified than “cv1€.

A prvalue of type “pointer to member of X of type cv1€ can be converted to a prvalue of type “pointer to member of X of type cv2€ if “cv2€ is more cv-qualified than “cv1€.

— end note]

5

#

[Note 4:

Function types (including those used in pointer-to-member-function types) are never cv-qualified ([dcl.fct]).

— end note]