Выше код имеет неопределенное поведение. Результат вашего reinterpret_cast<int**>(…)
на самом деле не указывает на объект типа int*
, но вы разыменовываете и перезаписываете сохраненное значение гипотетического int*
объекта в этом месте, нарушая по крайней мере строгое правило псевдонимов в процессе [basic.lval] / 11 . На самом деле в этом месте даже нет объекта какого-либо типа (ссылки не являются объектами) & hellip;
В вашем коде привязана ровно одна ссылка, и это происходит, когда конструктор Reference
инициализирует член r
. Ни при каких условиях ссылка не может быть связана с другим объектом. Кажется, это просто работает из-за того факта, что компилятор реализует ваш ссылочный элемент через поле, в котором хранится адрес объекта, на который ссылается ссылка, и который находится в том месте, на которое указывает неверный указатель & hellip;
Кроме того, у меня возникли бы сомнения в том, допустимо ли для начала использовать offsetof
в качестве базового члена. Даже если это так, эта часть вашего кода будет в лучшем случае условно поддерживаться с эффективным поведением, определяемым реализацией [support.types.layout] / 1 , поскольку ваш класс Reference
не является классом стандартного макета [class.prop] /3.1 (имеет элемент ссылочного типа).
Поскольку ваш код имеет неопределенное поведение, он не может быть переносимым & hellip;