Selon la Norme C++ (5.2.1 Subscripting)
1 postfix expression suivie par une expression entre crochets est
un postfix expression. L'une des expressions du type
"tableau de T" ou "pointeur de T" et l'autre doit avoir délimité
l'énumération ou de type intégral. Le résultat est de type "T". Le type
"T" doit être complètement définie par type d'objet.65 L'expression E1[E2]
est identique (par définition) à *((E1)+(E2)) ...
Donc vous pouvez utiliser n'importe quel type intégral, y compris le type int
et, en conséquence, les valeurs négatives à condition que le résultat de l'expression *((E1)+(E2))
est bien formé.
Prendre en compte le fait que pour les types définis par l'utilisateur vous pouvez utiliser une orthèse-init-liste de l'index. Par exemple
#include <iostream>
class Point
{
public:
Point( int x, int y ) : x( x ), y( y ) {}
int x, y;
};
class Circle
{
public:
Circle( unsigned int r ) : r( r ) {}
Circle & operator []( Point p )
{
std::cout << "Drawing a circle at ( " << p.x << ", " << p.y << " )\n";
return *this;
}
unsigned int r;
};
int main()
{
Circle circle( 10 );
circle[ { 0, 0 } ];
}
Le programme de la sortie est
Drawing a circle at ( 0, 0 )