Реконструктор> Разумеется. Задумка была под конец развертывать "программу" в списочно-линейный или индексно-линейный вид, что приведет к вымираню многих временных вещей, в т.ч. и этой декларации.
Реконструктор> А сейчас, домашнее задание: Почему мусор из памяти выполнятся не будет, и что конкретно произойдет, если напишем m_pOperators[OP_COUNT+1]->Execute()?
Припозднился я. Не знал про это топик.
Гриш, ты фигню толкаешь. У тебя строка m_pOperators[OP_COUNT] объявляет массив указателей на тип m_pOperators. Помятуя о том, что в С++ нет понятия встроенного "массив" — это просто кусок памяти размеров с OP_COUNT указателей. Указатель — встроенный тип. Значит всегда есть кандидат типа:
5.2.1 Subscripting [expr.sub]
1 A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “pointer to T” and the other shall have enumeration or integral type. The result is an lvalue of type “T.” The type “T” shall be a completely-defined object type.56) The expression E1[E2] is identical (by definition) to *((E1)+(E2)). [Note: see 5.3 and 5.7 for details of * and + and 8.3.4 for details of arrays. ]
Вот следующая цитата показывает почему ты не сможешь переопределить глобальный []:
[quote]
13.5.5 Subscripting [over.sub]
1 operator[] shall be a non-static member function with exactly one parameter. It implements the subscripting syntax
postfix-expression [ expression ]
Thus, a subscripting expression x[y] is interpreted as x.operator[](y) for a class object x of type T if T::operator[](T1) exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3.3).]
[/quote]
Вот кандидаты:
[quote]
13 For every cv-qualified or cv-unqualified object type T there exist candidate operator functions of the form
T* operator+(T*, ptrdiff_t);
T& operator[](T*, ptrdiff_t);
T* operator-(T*, ptrdiff_t);
T* operator+(ptrdiff_t, T*);
T& operator[](ptrdiff_t, T*);
[/quote]
Выбор происходит по
13.6 Built-in operators [over.built]
1 The candidate operator functions that represent the built-in operators defined in clause 5 are specified in
this subclause. These candidate functions participate in the operator overload resolution process as
described in 13.3.1.2 and are used for no other purpose.
т.к. сам массив не из объектов, а из указателей, то список членов-кандидадов будет пуст. Что оставляет только конкурирующие встроенные ф-ции-операторы.
Т.е. её семантика останется такой же, как и была. Или прямое обращение за пределы "массива". Проверки выхода за пределы — нет. Поэтому всё будет зависеть от того, что там лежит сразу за. Будет кака, может сразу прерывание вылезти (в случае виртуальной таблицы, т.е., если у тебя есть хоть один виртуальный метод) — может обнаружиться раньше и может быть будет прерывание. Для простого класса — методы будут вызваны статически, а им в качестве нулевого параметра, будут передано дерьмо.
Читай стандарт, пункты 13.5, 13.6, 13.3, 8.3.2.