Порядок оценки побочных эффектов для оператора присваивания в C ++ 11 - PullRequest
0 голосов
/ 28 ноября 2018

Я был бы очень признателен, если бы кто-то мог дать разъяснения относительно последовательности побочных эффектов для операторов присваивания в C ++ 11.Например, укажите мне на соответствующий стандартный текст, который имеет к нему отношение.

На странице порядок оценки на cpprefence.com указано следующее относительно заданий:

8) Побочный эффект (модификация левого аргумента) встроенного оператора присваивания и всех встроенных составных операторов присваивания упорядочивается после вычисления значения (но не побочных эффектов) как левого, так и правого аргументов и являетсяпоследовательность перед вычислением значения выражения присваивания (то есть перед возвратом ссылки на измененный объект)

Что подразумевается под "(но не побочными эффектами)? Являются ли побочные эффекты не секвенировано , секвенировано внутри последовательности или секвенировано после модификации левого аргумента (или, возможно, даже секвенировано после возврата ссылки?

В качестве примера, когда операции постинкрементного преобразования выполняются в: while (* tgt ++ = * src ++);

Кажется яснымИсходя из порядка оценки , сначала выполняются вычисления значений, поэтому сначала вычисляются *tgt и *src.Но известно ли, когда возникают постинкрементные побочные эффекты?

Редактировать # 1:

Неопределенное поведение и точки последовательности , насколько я понимаюне отвечай на мой вопрос.Фактически, это было начало моего спуска в «кроличью нору», которое в итоге привело меня к cppreference.com.Что я конкретно хочу знать, так это определение секвенирования побочных эффектов для оператора присваивания в C ++ 11.Ответ на вопрос в Неопределенные точки поведения и последовательности - это связь между секвенированием и понятиями undefined, unspecied behaviour и impementation specific behaviour.Что, кстати, очень хорошо отвечает.

Конец правки # 1

С уважением

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Что подразумевается под "(но не побочные эффекты)?

Это замечание подчеркивает тот факт, что предложение не претендует на последовательность побочных эффектов.

Являются ли побочные эффекты не секвенированными, внутренне секвенированными или секвенированными после изменения левого аргумента (или, возможно, даже секвенированными после возврата ссылки?

Это определяется в параграфах, в которых обсуждается каждыйспецифический побочный эффект. Например, побочный эффект оператора приращения постфикса секвенируется после вычисления его значения, и утверждается, что вызов функции с неопределенной последовательностью не может вмешиваться. Никаких других утверждений относительно последовательности этого оператора, которые я могунайти. Если их действительно нет, нужно сделать вывод, что это не последовательность по заданию.

0 голосов
/ 28 ноября 2018

Прежде всего, обратите внимание, что в C ++ 17 внесены некоторые изменения в порядок вычисления выражений .

Давайте сначала посмотрим, что говорит текущий черновик стандарта.Я думаю, что уместно здесь должно быть [intro.execution] / 7

[…] Оценка выражения (или подвыражения) в целом включает в себя оба вычисления значения (включая определениеидентичность объекта для оценки glvalue и извлечения значения, ранее назначенного объекту для оценки prvalue) и инициирование побочных эффектов.[…]

и [intro.execution] / 10

За исключением отмеченных случаев, оценки операндов отдельных операторов и подвыражений отдельныхвыражения не упорядочены.[…] Вычисления значений операндов оператора секвенируются до вычисления значения результата оператора.[…]

и, наконец, [expr.ass] / 1

[…] Во всех случаях присваивание выполняется после значениявычисление правого и левого операндов и перед вычислением значения выражения присваивания.Правый операнд упорядочен перед левым операндом.[…]

Исходя из этого, я бы пришел к выводу, что в

while (*tgt++ = *src++);

оценка *src упорядочена до оценки *tgt, а побочные эффектыкаждого приращения, а также присваивания не являются последовательными по отношению друг к другу.Поскольку условие в цикле while является полным выражением , все оценки и побочные эффекты, возникающие в одной итерации цикла, упорядочиваются перед оценками и побочными эффектами следующей итерации.

Насколько я вижу, в C ++ 11 , оценки *src и *tgt были непоследовательными по отношению друг к другу, но упорядочены допобочный эффект от назначения.Побочные эффекты приращений и назначения также не были связаны друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...