Здравствуйте, mp_op, Вы писали:
_>Мой вопрос в следующем, корректно ли по стандарту сравнивать
_>v1.v == v2.v
_>при условии, что изначально записаны в v1 был int*, а в v2 — char*?
Нет, некорректно.
_>Я знаю, что union_cast`ы запрещены. Но знаю, что любой указатель на объект в С++ можно сконвертировать в void* неявно. Нет ли тут лазейки?
Нет. Чтобы сконвертировать указатель, лежащий в юнионе, в void*, нужно сначала его оттуда достать. А чтобы достать из юниона, нужно знать, какой вариант активен.
_>В том и дело, что какой из вариантов активен — неизвестно. Нужно просто сравнить v1 и v2. Хочу узнать корректный способ.
Прежде чем «просто сравнивать», нужно определиться с понятием равенства. Я из всего этого объяснения так и не понял, что значит, что union { int* pi; void* pv } u1, в котором активен вариант pi, равен union { char* pch; void* pv } u2, в котором активен вариант pch. Обращаться к u1.pv или u2.pv нельзя, потому что это не активные варианты. И вообще ни к какому члену обоих юнионов нельзя обращаться, потому что мы не знаем, какой вариант активен.