Tel un pointeur ne peut pas participer à l'arithmétique des pointeurs, potentiellement utile des choses qui peut encore être fait pour obtenir son type avec decltype
ou reinterpret_cast
à un autre type de pointeur ou intptr_t
. C'est en raison de l'article 3.9p6 dit:
Un type de classe (comme "class X
") peuvent être incomplètes à un moment donné dans une unité de traduction et de compléter plus tard; le type "class X
" est du même type sur les deux points. Le type déclaré de l'objet de tableau pourrait être un tableau de classe incomplète et donc incomplète; si le type de classe est terminée plus tard dans l'unité de traduction, le type du tableau se complète; le type du tableau de ces deux points est le même type. Le type déclaré de l'objet de tableau pourrait être un tableau de taille inconnue et, par conséquent, être incomplètes à un moment donné dans une unité de traduction et de compléter plus tard; le tableau des types de ces deux points ("tableau d'inconnu lié d' T
" et "tableau d' N
T
") sont de types différents. Le type d'un pointeur de tableau de taille inconnue, ou d'un type défini par un typedef, la déclaration doit être un tableau de taille inconnue, ne peut pas être terminée.
5.3.1 dit:
Remarque: indirection par l'intermédiaire d'un pointeur vers un type incomplète (autres que cv
void
) est valable. La lvalue ainsi obtenu peut être utilisé de façon limitée (pour initialiser une référence, par exemple); ce lvalue ne doit pas être converti en prvalue, voir 4.1.
Depuis le tableau de pointeur de décomposition peut être réalisée sur la matrice de lvalues sans l'accord de conversion de rvalue, le code de la dpj gauche dans un commentaire est correct:
(*p)[i]
Règle pertinente, à partir de 4.2:
Une lvalue ou rvalue de type " tableau de N
T
" ou "tableau de l'inconnu lié d' T
" peut être converti en prvalue de type "pointeur vers T
". Le résultat est un pointeur vers le premier élément du tableau.