По пятам конкретной проблемы, самостоятельный ответ и комментарии к нему, я хотел бы понять, является ли это правильным решением, обходным путем/взломом или просто неправильным.
В частности, я переписал код:
T x = ...;
if (*reinterpret_cast <int*> (&x) == 0)
...
As:
T x = ...;
if (*reinterpret_cast <volatile int*> (&x) == 0)
...
с квалификатором volatile
к указателю.
Давайте просто предположим, что обращение с T
как с int
в моей ситуации имеет смысл. Решает ли этот доступ через ссылку volatile
проблему псевдонима указателя?
Для справки, из спецификации:
[Примечание: volatile — это подсказка реализации, чтобы избежать агрессивной оптимизации с участием объекта, поскольку значение объекта может быть изменено средствами, не обнаруживаемыми реализацией. Подробную семантику см. в 1.9. В общем, семантика volatile должна быть такой же в C++, как и в C. — примечание в конце]
РЕДАКТИРОВАТЬ:
Приведенный выше код действительно решил мою проблему, по крайней мере, на GCC 4.5.
volatile
? - person curiousguy   schedule 02.05.2015