[conv.qual]

# 7 Expressions [[expr]](./#expr)

## 7.3 Standard conversions [[conv]](conv#qual)

### 7.3.6 Qualification conversions [conv.qual]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L755)

A [*qualification-decomposition*](#def:qualification-decomposition "7.3.6 Qualification conversions [conv.qual]") 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]](basic.type.qualifier "6.9.5 CV-qualifiers")), and
each Pi is
âpointer toâ ([[dcl.ptr]](dcl.ptr "9.3.4.2 Pointers")),
âpointer to member of class Ci of typeâ ([[dcl.mptr]](dcl.mptr "9.3.4.4 Pointers to members")),
âarray of Niâ, or
âarray of unknown bound ofâ ([[dcl.array]](dcl.array "9.3.4.5 Arrays"))[.](#1.sentence-1)

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[.](#1.sentence-2)

[*Example [1](#example-1)*:

The type denoted by the [*type-id*](dcl.name#nt:type-id "9.3.2 Type names [dcl.name]") const int ** has three qualification-decompositions,
taking U as âintâ,
as âpointer to const intâ, and
as âpointer to pointer to const intâ[.](#1.sentence-3)

â *end example*]

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L782)

Two types T1 and T2 are [*similar*](#def:similar_types "7.3.6 Qualification conversions [conv.qual]") 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[.](#2.sentence-1)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L790)

The [*qualification-combined type*](#def:type,qualification-combined "7.3.6 Qualification conversions [conv.qual]") of two types T1 and T2 is the type T3 similar to T1 whose qualification-decomposition is such that:

- [(3.1)](#3.1)

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

- [(3.2)](#3.2)

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

- [(3.3)](#3.3)

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[.](#3.sentence-1)

A prvalue of type T1 can be converted to type T2 if the qualification-combined type of T1 and T2 is T2[.](#3.sentence-2)

[*Note [1](#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)[.](#3.sentence-3)

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](#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[.](#3.sentence-5)

â *end note*]

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L832)

[*Note [3](#note-3)*:

A prvalue of type âpointer to *cv1* Tâ can be
converted to a prvalue of type âpointer to *cv2* Tâ if
â*cv2* Tâ is more cv-qualified than â*cv1*Tâ[.](#4.sentence-1)

A prvalue of type âpointer to member of X of type *cv1*Tâ can be converted to a prvalue of type âpointer to member
of X of type *cv2* Tâ if â*cv2*Tâ is more cv-qualified than â*cv1* Tâ[.](#4.sentence-2)

â *end note*]

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L844)

[*Note [4](#note-4)*:

Function types (including those used in pointer-to-member-function types)
are never cv-qualified ([[dcl.fct]](dcl.fct "9.3.4.6 Functions"))[.](#5.sentence-1)

â *end note*]
