Считайте эту тему продолжением следующей темы:
Предыдущий выпуск
Неопределенное поведение и точки последовательности
Давайте вернемся к этому забавному и запутанному выражению (выделенные курсивом фразы взяты из темы выше * улыбка *):
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
- это не выражение для начала? Если да, то что это такое и каково определение выражения?
Если это выражение и в то же время его поведение также четко определено, то это означает, что количество точек последовательности, связанных с выражением, так или иначе зависит от типа em > операндов, участвующих в выражении. Я прав (хотя бы частично)?
Кстати, а как насчет этого выражения?
//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.
Вы также должны учитывать это в своем ответе (если вы точно знаете его поведение). :-)
Is
++++++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;
}
};
s
определяется пользователем!) - person Nawaz   schedule 09.01.2011i += ++i
становится хорошо определенным даже для встроенных типов. stackoverflow.com/q/10655290/365496 - person bames53   schedule 18.05.2012