Secondo Visual C++ (5.2.1 subscripting)
1 Un'espressione postfissa seguita da un'espressione tra parentesi quadre è un'espressione suffisso. Una delle espressioni deve avere il tipo "matrice di T" o "puntatore a T" e l'altra deve avere l'enumerazione senza ambito o il tipo integrato. Il risultato è di tipo "T." Il tipo "T" deve essere un tipo di oggetto completamente definito.65 L'espressione E1 [E2] è identica (per definizione) a * ((E1) + (E2)). ..
così si può usare qualunque tipo integrale che comprende tipo int
e valori corrispondentemente negativi a condizione che il risultato dell'espressione *((E1)+(E2))
è ben formato.
Prendere in considerazione che per i tipi definiti dall'utente è possibile utilizzare un elenco di inizializzazione come indice. Per esempio
#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 } ];
}
L'output del programma è
Drawing a circle at (0, 0)
fonte
2015-08-18 10:14:23
Just an sulla risposta tovagliolo a memoria, ma credo che foo [x] è definito nello standard come esattamente equivalente a * (foo + x) dove x è un tipo integrale e foo è un puntatore quindi penso che sarebbe legale in qualsiasi posto sia il più tardi. – Vality
Non farlo in C++. Se vedo 'thing [-1]' penso "oh, posso leggere bene l'ultimo elemento" - come Python, non "è la cosa prima di qualunque cosa ciò faccia" –
@AlecTeal che non è davvero un buon motivo per non consentire Questo. Se abbiamo respinto ogni espressione che ingannevolmente somigliava a una forma di un'altra lingua popolare, non sarebbe rimasto nulla. Non saremmo neanche in grado di scrivere le dichiarazioni di IF perché assomigliano molto all'IF aritmetico di Fortan II. –