Spec-Zone.ru › GCC 11

Далее: Ограничение алиасов указателей, Вверх: Расширения языка C++ [Содержание][Индекс]

7.1 Когда обращается к объекту C++ с модификатором volatile? ¶

Стандарт C++ отличается от стандарта C в обработке объектов с модификатором volatile. Он не определяет, что представляет собой обращение к volatile объекту, за исключением указания, что C++ должен вести себя аналогично C в отношении volatile объектов, где это возможно. Однако разная природа выражений с lvalue между C и C++ усложняет поведение. G++ ведет себя так же, как GCC при обращении к volatile объектам. См. Volatile для описания поведения GCC.

Спецификации языков C и C++ отличаются при обращении к объекту в контексте void:

volatile int *src = somevalue;
*src;

Стандарт C++ определяет, что такие выражения не претерпевают преобразования lvalue в rvalue и что тип разыменованного объекта может быть неполным. Стандарт C++ не указывает явно, что именно преобразование lvalue в rvalue вызывает доступ. Есть основания полагать, что это так, поскольку в противном случае определенные простые выражения становятся неопределенными. Однако, чтобы не удивить большинства программистов, G++ обрабатывает разыменование указателя на volatile объект полного типа так же, как GCC для эквивалентного типа в C. Если объект имеет неполный тип, G++ выдает предупреждение; если вы хотите получить ошибку, необходимо принудительно преобразовать в rvalue, например, с помощью static_cast.

При использовании ссылки на volatile G++ не обрабатывает эквивалентные выражения как обращение к volatile объектам, а вместо этого выдает предупреждение, что к volatile объекту не происходит обращение. Это обосновано тем, что в противном случае становится трудно определить, где происходит обращение к volatile, и невозможно проигнорировать возвращаемое значение функций, возвращающих volatile ссылки. Опять же, если вы хотите принудительно выполнить чтение, преобразуйте ссылку в rvalue.

G++ реализует такое же поведение, как и GCC, при присваивании volatile объекту — нет повторного чтения присвоенного объекта, присвоенное rvalue используется повторно. Обратите внимание, что в C++ выражения присваивания являются lvalue, и если они используются как lvalue, к volatile объекту происходит обращение. Например, vref ссылается на vobj, как ожидалось, в следующем примере:

volatile int vobj;
volatile int &vref = vobj = something;

Далее: Ограничение алиасов указателей, Вверх: Расширения языка C++ [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/C_002b_002b-Volatiles.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API