Не ответ
Это просто проблема с формулировкой вопроса и ответов. Проблема возникает из-за невозможности конвертировать указатели в изменчивые объекты в пустые указатели, а не изменчивые указатели .
Разница, которая весьма важна, заключается в том, какой элемент памяти является энергозависимым. В этом вопросе указатель не является энергозависимым (его можно кэшировать, и его не нужно сбрасывать в память при его изменении), а наоборот, указанную память:
int volatile * p = f();
p++; // this does not affect the perceived state of the c++ memory model
++p;
*p = 5; // this changes the perceived state
Причина, по которой это важно, заключается в том, что с изменчивым указателем на память сам указатель имеет особую обработку.
void foo( int * );
int * volatile p = f(); // 1
foo(p); // 2
int volatile * q = f();
//foo(q); // error, cannot convert pointer to volatile to pointer to non-volatile
*q = 5; // 3
q = 0; // 4
В приведенном выше коде операции, помеченные как 1 и 2, полностью перемещаются в память. Назначение в [1] должно быть сохранено в памяти. Даже если значение p
находится в регистре, оно будет загружено из памяти в [2]. Операция, помеченная [3], изменяет значение, обозначенное q
, которое равно volatile
, и будет полностью заполнять основную память, тогда как операция [4] влияет только на указатель, который не является volatile
, и это не является частью воспринимаемого состояния модели памяти c ++ и может выполняться в регистрах (обратите внимание, что компилятор может оптимизировать q
и выполнять операции в регистре, тогда как p
не может быть оптимизирован.