2012-04-18 3 views
2

A patch был отправлен в gcc, который предоставляет что-то, называемое векторной подписью на g ++ (gcc уже имел его).Являются ли векторные индексы стандартными C/C++?

Если a - это массив, а i - это int, то i[a] является юридическим и равен a[i].

double a[]{0.0, 1.0, 2.0, 3.0}; // C++11 style but would work in C++98 style too. 
assert(a[2] == 2.0); 
assert(2[a] == 2.0); 

Итак, является ли это законным и стандартным C/C++ или это расширение gcc?

На самом деле, Google показывает, что у MS Developer Studio тоже есть это. Я смотрел в стандарте C++ и не видел его.

+4

Поскольку выражения '* (ptr + i)' и 'ptr [i]' идентичны, ответ отлично переносится из коммутативности добавления. Если я вижу, что кто-то из моей команды использует эту «функцию», он будет уволен на месте. – dasblinkenlight

+0

Да, это противоречит интуиции и удивит людей, просматривающих код. Кроме того, к счастью, он работает по арифметике указателя, а не по лексическому правилу, поэтому он не будет работать, скажем, для std :: vector или std :: array. – emsr

+0

Возможный дубликат [In C массивов, почему это правда? a \ [5 \] == 5 \ [a \]] (http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a) –

ответ

11

Патч не имеет отношения к i[a], что эквивалентно a[i]; что всегда имело место на обоих языках. Если не определены пользовательские типы, a[i] определяется как эквивалентный *(a+i), а дополнение является коммутативным.

Патч относится к vector datatypes (не следует путать с шаблоном класса C++ std::vector), расширение языка GCC для поддержки инструкций по обработке векторов. Согласно примечаниям патча, они были индексируемыми как массивы в C, но не C++, и этот патч добавляет эту особенность в C++.

+0

Еще одна " Я буду ... WTF "моментом в путешествиях на C++. Я также вижу обоснование этого синтаксиса. Спасибо. – emsr

+0

ОК, я, наконец, следовал стандарту expr.add p5 и dcl.array p6, где они говорят об этом. – emsr

+0

не быть педантичным, но разве вы не подразумеваете, что 'a [i]' is '* (a + i)' для примитивов или что-то в этом роде? Потому что из того, что вы говорите, это звучит как класс с оператором разыменования и сложения, который автоматически получит 'operator []', что, очевидно, не так. – Grizzly

3

Да, это законно, поскольку элементы вектора гарантированы, чтобы быть смежными в памяти по стандарту.

Обратите внимание, что:

a[i] == i[a] == *(a+i) 
5

В C, это следует из того факта, что a[b] эквивалентно *(a + b), который с + является commutative, конечно, является такой же, как *(b + a).