Розгляньте цю тему як продовження наступної теми:
Попередній внесок
Невизначена поведінка та точки послідовності
Давайте ще раз переглянемо цей кумедний і заплутаний вираз (курсив викладено з вищезазначеної теми * посмішка *):
i += ++i;
Ми говоримо, що це викликає невизначену поведінку. Я вважаю , що , коли говорять про це, ми неявно припускаємо , що тип з i
є одним з вбудованих типів.
Що робити , якщо тип з i
є певний користувачем тип? Скажімо, його тип Index
визначений далі у цій публікації (див. Нижче). Чи все одно це буде викликати невизначену поведінку?
Якщо так, чому? Хіба це не еквівалентно письму i.operator+=(i.operator++());
чи навіть синтаксично простіше i.add(i.inc());
? Або вони теж посилаються на невизначену поведінку?
Якщо ні, чому ні? Зрештою, об'єкт i
змінюється двічі між послідовними точками послідовності. Будь ласка, згадайте правило: вираз може змінювати значення об'єкта лише один раз між послідовними "точками послідовності . І якщо i += ++i
це вираз, то він повинен викликати undefined-поведінку. Якщо так, то його еквіваленти 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;
}
};