Считайте эту тему продолжением следующей темы:
Предыдущий выпуск
Неопределенное поведение и точки последовательности
Пусть ' s еще раз посетите это смешное и запутанное выражение (выделенные курсивом фразы взяты из вышеупомянутой темы * улыбка *):
i += ++i;
Мы говорим, что это вызывает неопределенное поведение. Я предполагаю, что, говоря это, мы неявно предполагаем, что тип из i
является одним из встроенных типов.
Что если тип из i
- это пользовательский тип? Скажем, его тип - Индекс
, который будет определен позже в этом сообщении (см. Ниже). Будет ли он по-прежнему вызывать неопределенное поведение?
Если да, то почему? Разве это не эквивалентно записи i.operator + = (i.operator ++ ());
или даже синтаксически проще i.add (i.inc ());
? Или они тоже вызывают неопределенное поведение?
Если нет, то почему? После всего, объект i
изменяется дважды между последовательными точками последовательности. Вспомните эмпирическое правило: выражение может изменять значение объекта только один раз между последовательными "точками последовательности . И если i + = ++ i
является выражением, то оно должно вызывать undefined-behavior. Если это так, то его эквиваленты i.operator + = (i.operator ++ ());
и i.add (i.inc ());
также должны вызывать undefined -поведение, которое кажется неверным! (насколько я понимаю)
Или, 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;
четко определен в C ++ 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;
}
};