У меня проблема, вызванная нарушением строгого правила псевдонима указателя. У меня есть тип T
, полученный из шаблона, и некоторый интегральный тип Int
того же размера (как и sizeof
). Мой код по существу делает следующее:
T x = some_other_t;
if (*reinterpret_cast <Int*> (&x) == 0)
...
Поскольку T
— это некоторый произвольный (кроме ограничения по размеру) тип, который может иметь конструктор, я не могу создать объединение T
и Int
. (Это разрешено только в C++0x и даже не поддерживается GCC).
Можно ли как-нибудь переписать приведенный выше псевдокод, чтобы сохранить функциональность и избежать нарушения строгого правила псевдонимов? Обратите внимание, что это шаблон, я не могу контролировать T
или значение some_other_t
; присваивание и последующее сравнение происходят внутри шаблонного кода.
(Кстати, приведенный выше код начал ломаться в GCC 4.5, если T
содержит какие-либо битовые поля.)
T
может быть любым, включая побитовый 0, мне нужно пометить не более одной позиции как непустую, даже если она выглядит пустой. Сравнение является проверкой того, следует лиx
помечать так или нет. - person doublep   schedule 05.06.2010reinterpret_cast
позволяет вам игнорировать две разные причины для хранения0
? - person Stephen   schedule 05.06.2010x
в памяти всеми нулями? - person Oliver Charlesworth   schedule 05.06.2010T
не равны==
, они не могут быть равны по битам, по крайней мере, для любого полезного определения равенства в контейнере. Таким образом, в уникальном контейнере не может быть двух нулевых побитовых элементов (если справедливо равенство). - person doublep   schedule 05.06.2010