Spec-Zone.ru › GCC 7

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

Стандарт C++ отличается от стандарта C в обращении с объектами volatile. Он не определяет, что представляет собой доступ к volatile объекту, за исключением того, что C++ должен вести себя аналогично C по отношению к volatile, где это возможно. Однако разная левосторонность выражений в 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, например, с помощью статического преобразования.

При использовании ссылки на 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-7.5.0/gcc/C_002b_002b-Volatiles.html

Spec-Zone.ru

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