Uma decomposição de qualificação de um tipo
T
é uma sequência de cvi e Pi tal queT
é“cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U” para n ≥ 0,
onde cada cvi é um conjunto de qualificadores cv ([basic.type.qualifier]), e cada Pi é um “ponteiro para” ([dcl.ptr]), […]
[Exemplo 1: O tipo denotado pelo type-id
const int **
tem três decomposições de qualificação, tomando U como “int
”, como “ponteiro para constint
” e como “ponteiro para ponteiro paraconst int
”. - exemplo final]
Não entendo como a descrição " “cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U” para n ≥ 0," é compatível com o exemplo.
Quero dizer, o exemplo é para T == const int**
e diz-se que existe uma decomposição possível para U ser int
. Como isso é possível? Como const int**
( T
) pode ser escrito como cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn int
?
Mas, de maneira mais geral, não entendo por que U está no final e não no início daquele cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U_. Como pode algo que começa com, digamos, const * volatile * const*
ser um tipo?
cv_0 P_0 cv_1 P_1 ⋯ cv_n-1 P_n-1 cv_n U
não se destina a representar a forma sintática de um ID de tipo comoconst int**
.Destina-se a representar o nome formal de texto completo para um tipo após substituir
U
,P
s ecv
s.Como diz a nota o tipo formado pelo type-id
const int**
é formalmente " ponteiro para ponteiro paraconst
int
" (eint const**
formaria esse mesmo tipo).Você obtém esse nome formal
.
cv_0 P_0 cv_1 P_1 ⋯ cv_n-1 P_n-1 cv_n U
escolhendon = 2
e substituindoU
byint
,cv_2
byconst
,P_1
por "ponteiro para",P_0
por "ponteiro para" e o cv restante por