Соответствующий абзац в стандарте такой:
Оператор присваивания сохраняет значение в объекте, обозначенном левым операндом.Выражение присваивания имеет значение левого операнда после присваивания, но не является lvalue.Типом выражения присваивания является тип левого операнда, если только левый операнд не имеет квалифицированного типа, и в этом случае это неквалифицированная версия типа левого операнда.Побочный эффект обновления сохраненного значения левого операнда должен происходить между предыдущей и следующей точкой последовательности.
Таким образом, это ясно делает различие между «значением левого операнда» и обновлениемсохраненного значения.Также обратите внимание, что возвращаемое значение не является lvalue (поэтому в возвращаемом выражении нет ссылки на переменную), и все квалификаторы потеряны.
Поэтому я читаю это как gcc, который делает правильные вещи, когда возвращаетзначение, которое оно сознательно должно хранить.
Редактировать:
В следующем стандарте планируется уточнить это, добавив сноску:
Реализация может считывать объект для определения значения, но не обязательна, даже если объект имеет тип с изменяемыми значениями.
Редактировать 2:
На самом деле есть еще один абзац об операторах выражений, который может пролить свет на это:
Выражение в выражении оператора оценивается как пустое выражение для его побочных эффектов. \ Footnote {Например, присваиванияи вызовы функций, которые имеют побочные эффекты}
Поскольку это подразумевает, что эффект возврата значения не требуется для такого оператора, это сильнопредполагает, что значение может быть загружено из переменной только в том случае, если оно используется.
Как итог, ваш клиент действительно справедливо расстроен, когда видит, что переменная загружена.Такое поведение может соответствовать стандарту, если вы расширите его толкование, но оно явно находится на грани приемлемости.