Рассмотрим следующий код:
int main()
{
int i;
volatile int* p = &i;
int *v = p;
return 0;
}
Это дает ошибку в g++
:
$ g++ -o volatile volatile.cpp
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’
Мое намерение состояло в том, что я хочу сделать p
volatile. Однако, как только я прочитал значение p
, мне все равно, является ли доступ к v
неустойчивым. Почему требуется, чтобы v
был объявлен изменчивым?
Это, конечно, гипотетический код. В реальной ситуации вы можете себе представить, что p
указывает на ячейку памяти, но изменяется извне, и я хочу, чтобы v
указывал на то место, которое p
указывало во время v = p
, даже если позже p
изменен извне. Поэтому p
является изменчивым, но v
не является.
Кстати, меня интересует поведение, когда это считается C и С++, но в C это порождает предупреждение, а не ошибку.