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