Идея NullableOffsetPtr вдохновлена boost::interprocess::offset_ptr.
В какой степени может ли их реализация справиться с ограничениями expr.add#4.2 и избежать UB?
- Нашел термин «незаконно, но правильно» в контексте встраивания:< /li>
Код: Выделить всё
//Note: using the address of a local variable to point to another address
//is not standard conforming and this can be optimized-away by the compiler.
//Non-inlining is a method to remain illegal but correct
- boost::interprocess::offset_ptr выполняет всю арифметику с использованием uintptr_t, полностью избегая ограничений expr.add#4.2. По крайней мере, для преобразований T offset_ptr он также гарантирует обратный путь, т. е. указатель воспроизводится из того же целочисленного значения, которое получено в результате преобразования исходного указателя в целочисленное. Это всего лишь следствие того, что арифметические операции являются обратными, поэтому с помощью reinterpret_cast пункта объяснения 3) утверждение
звучит достаточно, чтобы его можно было четко определить? Я сомневаюсь, что это справедливо и для операторов увеличения/уменьшения offset_ptr, но для меня это не имеет большого значения.
- Выполняется преобразования с помощью вспомогательных функций с использованием аргументов const volutious void*. Таким образом, reinterpret_cast никогда не соединяет T* и uintptr_t напрямую, но всегда имеет тип void на входе или выходе.
Подробнее здесь: https://stackoverflow.com/questions/784 ... -behaviour