If the variable is declared volatile
then it is undefined behaviour to cast away the volatile
, just as it is undefined behaviour to cast away the const
from a variable declared const
. See Annex J.2 of the C Standard:
The behavior is undefined in the following circumstances:
…
— An attempt is made to modify an object defined with a const-qualified type through
use of an lvalue with non-const-qualified type (6.7.3).— An attempt is made to refer to an object defined with a volatile-qualified type through
use of an lvalue with non-volatile-qualified type (6.7.3).
If, however, you just have a volatile
pointer or a volatile
reference to a non-volatile
variable then you can freely cast away volatile
.
volatile int i=0;
int j=0;
volatile int* pvi=&i; // ok
volatile int* pvj=&j; // ok can take a volatile pointer to a non-volatile object
int* pi=const_cast<int*>(pvi); // Danger Will Robinson! casting away true volatile
int* pj=const_cast<volatile int*>(pvj); // OK
*pi=3; // undefined behaviour, non-volatile access to volatile variable
*pj=3; // OK, j is not volatile