Неопределенное поведение и точки последовательности перезагружены

Считайте эту тему продолжением следующей темы:

Предыдущий выпуск
Неопределенное поведение и точки последовательности

Пусть ' 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;
        }
};

84
задан Community 23 May 2017 в 12:34
поделиться