Извините, что снова открываю эту тему, но размышления над этой темой сами по себе начали давать мне неопределенное поведение. Хотите перейти в зону четко определенного поведения.
Данный
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
Теперь перейдем к поведению. Вот важные цитаты из C ++ 0x.
$ 1.9 / 12- "Оценка выражения (или подвыражения) в целом включает в себя как вычисления значений (включая определение идентичности объекта для оценки lvalue и получение значения, ранее назначенного объекту для оценки rvalue), так и инициирование побочных эффектов . "
$ 1.9 / 15- "Если побочный эффект для скалярного объекта не упорядочен относительно другого побочного эффекта для того же скалярного объекта или вычисления значения с использованием значения того же скалярного объекта, поведение не определено. . "
[Примечание: вычисления значений и побочные эффекты, связанные с различными выражениями аргументов, неупорядочены. - конец примечания]
$ 3.9 / 9- "Арифметические типы (3.9.1), типы перечисления, типы указателей, указатели на типы членов (3.9.2), std :: nullptr_t и версии этих типов с квалификацией cv (3.9.3) вместе называются скалярные типы ".
В Expr1 оценка выражения
i
(первый аргумент) не упорядочена по отношению к оценке выраженияoperator++(i)
(которое имеет побочный эффект).Следовательно, Expr1 имеет неопределенное поведение.
В Expr2 оценка выражения
i
(первый аргумент) не упорядочена по отношению к оценке выраженияoperator++(i, 0)
(которое имеет побочный эффект) '.Следовательно, Expr2 имеет неопределенное поведение.
В Expr3 оценка единственного аргумента
operator++(i)
должна быть завершена до вызова внешнегоoperator++
.Следовательно, Expr3 имеет четко определенное поведение.
В Expr4 оценка выражения
i
(первый аргумент) не упорядочена по отношению к оценкеoperator[](operator++(i, 0)
(что имеет побочный эффект).Следовательно, Expr4 имеет неопределенное поведение.
Это понимание правильное?
P.S. Метод анализа выражений как в OP неверен. Это связано с тем, что, как отмечает @Potatoswatter, «пункт 13.6 не применяется. См. Отказ от ответственности в 13.6 / 1,« Эти функции-кандидаты участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2, и не используются ни для каких других целей. «Это просто фиктивные объявления; не существует семантики вызова функций по отношению к встроенным операторам».
:)
- person Prasoon Saurav   schedule 04.10.2010++
[внутренним] и++
[внешним], не упорядочены относительно друг друга (хотя вычисления значений последовательны).:)
- person Prasoon Saurav   schedule 04.10.2010Some more complicated cases are not diagnosed by -Wsequence-point option, and it may give an occasional false positive result,.....
. - person Prasoon Saurav   schedule 04.10.2010