В соответствии со стандартом C++ (5.2.1) индексации
1 постфиксного выражение следует выражение в квадратных скобках выражения постфикса. Одно из выражений должно иметь тип «массив Т» или «указатель на Т», а другой должен иметь нумерацию или интегральный тип. Результат имеет тип «T». Тип «T» должен быть полностью определенным типом объекта.65 Выражение E1 [E2] идентично (по определению) на * ((E1) + (E2)). ..
Таким образом, вы можете использовать любой интегральный тип, включая тип int
и, соответственно, отрицательные значения при условии, что результат выражения *((E1)+(E2))
хорошо образован.
Примите во внимание, что для пользовательских типов вы можете использовать список начала скобки как индекс. Например
#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 } ];
}
Выход программы
Drawing a circle at (0, 0)
Просто на салфетке ответа из памяти, но я считаю, что Foo [х] определяется в стандарте как именно эквивалентно * (Foo + х), где x - целочисленный тип, а foo - указатель, поэтому я думаю, что это было бы законно в любом месте, чем позже. – Vality
Не делайте этого на C++. Если я вижу 'вещь [-1]' я думаю, о, я могу прочитать последний элемент красиво »- как и Python, а не« это то, что до этого указывает на » –
@AlecTeal, что на самом деле не является хорошей причиной для запрета это. Если бы мы отказались от каждого выражения, которое вводило в заблуждение образ формы с другого популярного языка, ничего не оставалось бы. Мы даже не сможем писать IF-инструкцию, так как они очень похожи на арифметику Fortan II IF. –