Spec-Zone.ru › GCC 4

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, например, с помощью 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;

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

Spec-Zone.ru

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