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