[conv.qual]/1:

--

A *cv-decomposition* of a type T is a sequence of cvi 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

: *end example*

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

— The n-tuple of cv-qualifiers after the first one in the longest cv-decomposition of T, that is, cv1,cv2,…,cvn, is called the *cv-qualification signature* of T.

- This commit changed the cv-decomposition above from n > 0 to n >= 0. As far as I 'm concerned the n > 0 was correct.
- The paragraph above says the following: "The type denoted by the type-id

const int ** has two cv-decompositions taking U as "int" and as "pointer to const int".

To the best of my knowledge I would say that the the type-id const int ** has the following cv decomposition:

cv0 = {} P0 = {pointer to}

cv1 = {} P1 = {pointer to}

cv2 = {const} U{ int}

Belloc