Извините за то, что вы снова открыли эту тему, но, думая об этой теме, я начал давать мне Undefined Behavior. Хотите переместиться в зону четко определенного поведения.
Учитывая
int i = 0;
int v[10];
i = ++i; //Expr1
i = i++; //Expr2
++ ++i; //Expr3
i = v[i++]; //Expr4
Я думаю о вышеупомянутых выражениях (в этом порядке) как
operator=(i, operator++(i)) ; //Expr1 equivalent
operator=(i, operator++(i, 0)) ; //Expr2 equivalent
operator++(operator++(i)) ; //Expr3 equivalent
operator=(i, operator[](operator++(i, 0)); //Expr4 equivalent
Приступая к поведению здесь важны цитаты из С++ 0x.
$1.9/12- "Оценка выражения (или подвыражение) в целом включает в себя как вычисления значений (включая определение личности объект для оценки lvalue и значение fetchinga, ранее присвоенное объект для оценки rvalue) и инициирование побочных эффектов."
$1.9/15- "Если побочный эффект скаляра объект не зависит от либо другой побочный эффект на тот же скалярный объект или значение вычисление с использованием значения тот же скалярный объект, поведение undefined".
[Примечание: вычисление значения и сторона эффекты, связанные с различными выражения аргументов не имеют никакого значения. -end note]
$3.9/9- "Арифметические типы (3.9.1), типы перечислений, типы указателей, указатель на типы членов (3.9.2), std:: nullptr_t и cv-qual версии этих типов (3.9.3) все вместе называются скалярными типами.
-
В Expr1 оценка выражения
i
(первый аргумент) не влияет на оценку истеченияoperator++(i)
(которая имеет побочный эффект).Следовательно, Expr1 имеет поведение Undefined.
-
В Expr2 оценка выражения
i
(первый аргумент) не влияет на оценку истеченияoperator++(i, 0)
(который имеет побочный эффект).Следовательно, Expr2 имеет поведение Undefined.
-
В Expr3 оценка одиночного аргумента
operator++(i)
должна быть полной до того, как вызывается внешнийoperator++
.Следовательно, Expr3 имеет хорошо определенное поведение.
-
В Expr4 оценка выражения
i
(первый аргумент) не влияет на оценкуoperator[](operator++(i, 0)
(которая имеет побочный эффект).Следовательно, Expr4 имеет поведение Undefined.
Правильно ли это понимание?
P.S. Метод анализа выражений, как в OP, неверен. Это связано с тем, что, поскольку @Potatoswatter, примечания - "пункт 13.6 не применяется, см. Отказ от ответственности в 13.6/1", эти кандидатские функции участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2, и используются для других целей. "Это просто фиктивные декларации, не существует семантики функциональных вызовов в отношении встроенных операторов".