Не имеет смысла спрашивать, имеет ли *&++i
UB. Отсрочка не обязательно получает доступ к сохраненному значению (ранее или новому) i
, как вы можете видеть, используя это как выражение инициализатора для ссылки. Только если участвует преобразование rvalue (использование в таком контексте), есть ли вообще вопрос для обсуждения. И тогда, поскольку мы можем использовать значение ++i
, мы можем использовать значение *&++i
с точно такими же предостережениями, как и для ++i
.
Исходный вопрос касался в основном i = ++i
, что аналогично i = *&++i
. Это было неопределенное поведение в C++ 03, из-за того, что i
дважды модифицировалось между точками последовательности и хорошо определено в C++ 11 из-за побочных эффектов оператора присваивания, секвенированного после вычислений значений слева и правой стороны.
Возможно, уместно отметить, что ненормативные примеры в стандартах C++ 98 и C++ 03 были неверными, описывая некоторые случаи формально неопределенного поведения как просто неопределенное поведение. Таким образом, намерение не было полностью ясным, на всем пути назад.Хорошее эмпирическое правило состоит в том, чтобы просто не полагаться на такие неясные угловые случаи языка, чтобы избежать их: не нужно быть юридическим языком, чтобы иметь смысл кода и hellip;
В этом ответе очень хорошо осведомленный «Johannes Schaub-litb» комментирует, что он считает, что это неверное утверждение. И не получает ответа. –
@DrewDormann James Kanze также очень хорошо осведомлен –
'* & i' был бы абсолютно прав, и' ++ i' возвращает ссылку на 'i', поэтому я сам не вижу проблему ... –