Рассмотрите эту тему в следующем разделе:
Предыдущий взнос
Undefined поведение и точки последовательности
Пересмотрите это смешное и запутанное выражение (выделенные курсивом фразы взяты из вышеупомянутой темы * smile *):
i += ++i;
Мы говорим, что это вызывает поведение undefined. Я предполагаю, что, сказав это, мы неявно предполагаем, что тип i
является одним из встроенных типов.
Что делать, если тип i
является определяемым пользователем типом? Скажем, что его тип Index
, который определен ниже в этом сообщении (см. Ниже). Будет ли он ссылаться на undefined -behavior?
Если да, то почему? Разве это не эквивалентно написанию i.operator+=(i.operator++());
или даже синтаксически проще i.add(i.inc());
? Или они также ссылаются на undefined -behavior?
Если нет, почему бы и нет? В конце концов, объект i
получает изменение дважды между последовательными точками последовательности. Пожалуйста, вспомните эмпирическое правило: выражение может изменять значение объекта только один раз между последовательными "точками последовательности". И если i += ++i
- выражение, тогда он должен вызывать undefined -behavior. Если это так, то его эквиваленты i.operator+=(i.operator++());
и i.add(i.inc());
также должны ссылаться на undefined -behavior, что кажется неверным! (насколько я понимаю)
Или, i += ++i
не является выражением для начала? Если да, то что это такое и каково определение выражения?
Если это выражение и в то же время его поведение также четко определено, то это означает, что количество точек последовательности, связанных с выражением, как-то зависит от типа используемых операндов в выражении. Правильно ли (даже частично)?
Кстати, как насчет этого выражения?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
Вы тоже должны учитывать это в своем ответе (если вы точно знаете его поведение).: -)
Есть
++++++i;
четко определен в С++ 03? В конце концов, вот что,
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};