Ответ 1
Обновление 18 февраля 2017 года
Ответ ниже приводит цитаты и обсуждает язык в Стандарте, некоторый противоречивый язык в Обосновании и некоторые комментарии от gnu.cc re противоречие. Существует отчет о дефекте, который по существу имеет соглашение о комитете (хотя и все еще открыто), которое должен сказать стандарт, и что намерение всегда было и что реализации всегда отражали, что важна не волатильность объекта (на Standard), а волатильность (lvalue of) доступа (согласно Обоснованию). (Подтвердите Olaf за упоминание этого DR.)
Резюме отчета о дефектах для версии C11 1.10 Дата: апрель 2016 DR 476 летучая семантика для lvalues 04/2016 Open
Нет. Поскольку доступ к объекту не является изменчивым.
Объект p
имеет указатель типа на volatile int. Но x
не является объектом нестабильного типа. Квалификации на p влияют на то, какие обращения могут быть сделаны через него, но не влияют на тип объекта, на который он указывает. Нет ограничений на доступ к объекту неквалифицированного типа с помощью летучего lvalue. Таким образом, доступ к x через p не является доступом к объекту с изменчивым квалификационным типом.
(См. 6.7.3. Определите типы ограничений для доступа к объектам с квалифицированными типами. Он просто говорит, что вы не можете получить доступ к летучим квалифицированным объектам с помощью неквалифицированного lvalue.)
С другой стороны, этот пост цитирует из 6.7.3 Обоснования для международного стандарта - Языки программирования - C:
Приведение значения к квалифицированному типу не влияет; квалификация (volatile, say) может не влиять на доступ, так как это произошло до случая. Если необходимо получить доступ к энергонезависимому объекту используя изменчивую семантику, метод заключается в том, чтобы указать адрес объект к соответствующему типу-указателю, а затем разыменованию этот указатель.
Однако я не могу найти язык в стандарте, в котором говорится, что семантика основана на типе lvalue. Из gnu.org:
Одной из областей путаницы является различие между объектами, летучих типов и летучих значений. Из стандартной точки C view, объект, определенный с помощью изменчивого типа, внешне внешне поведение. Вы можете думать о таких объектах, как наличие небольшого осциллографа зондов, прикрепленных к ним, чтобы пользователь мог наблюдать некоторые свойства доступа к ним, так же как пользователь может наблюдать данные, записанные в выходных файлов. Однако стандарт не дает понять, пользователи могут наблюдать за доступом с помощью летучих lvalues к обычным объектам.
[..] из стандарта неясно, являются ли летучие lvalues обеспечивают больше гарантий в целом, чем нелетучие значения, если базовые объекты являются обычными.
Нет, потому что побочных эффектов нет:
Даже если семантика *p
должна быть нестабильной, стандарт все же говорит:
5.1.2.3 Выполнение программы 4 В абстрактной машине все выражения оценивается как определено семантикой. Фактическая реализация не нужно оценивать часть выражения, если он может вывести, что его значение не используется и что никаких необходимых побочных эффектов не производится (в том числе вызванных вызовом функции или доступа к изменчивой объект).
Опять же, в вашем коде нет изменчивого объекта. Хотя компиляционная единица, которая видит только p
, не может сделать эту оптимизацию.
Также имейте в виду
6.7.3. Спецификаторы типов 7 [...] Что представляет собой доступ к объекту, который имеет тип с изменчивой квалификацией, определяется реализацией.
5.1.2.3 Выполнение программы 8 Более строгие соответствия между абстрактной и фактической семантикой могут быть определены каждой реализацией.
Таким образом, простое появление неустойчивых значений не говорит вам, что такое "доступ". Вы не имеете права говорить о "единственном доступе к *p
от tmp = *p
", за исключением случаев документированного поведения реализации.