А traceable pointer object это
объект object pointer type, или
объект интегрального типа размером не менее std::intptr_t, или
последовательность элементов в массиве narrow character type, где размер и выравнивание последовательности соответствуют таковым у некоторого типа указателя на объект.
Значение указателя является safely-derived pointer динамическим объектом, только если он имеет тип указателя на объект и является одним из следующих:
значение, возвращаемое вызовом реализации стандартной библиотеки C ++ ::operator new(std::size_t) или ::operator new(std::size_t, std::align_val_t);40
результат взятия адреса объекта (или одного из его подобъектов), обозначенного lvalue в результате косвенного обращения через безопасно полученное значение указателя;
результат четко определенной арифметики указателя ([expr.add]) с использованием безопасно полученного значения указателя;
результат четко определенного преобразования указателя ([conv.ptr], [expr.cast]) безопасного значения указателя;
результат reinterpret_cast безопасного получения значения указателя;
результат reinterpret_cast целочисленного представления безопасного значения указателя;
значение объекта, значение которого было скопировано из отслеживаемого объекта-указателя, где во время копирования исходный объект содержал копию безопасно полученного значения указателя.
Целочисленное значение является значением integer representation of a safely-derived pointer только в том случае, если его тип не меньше размера, std::intptr_t и это одно из следующих значений:
результат reinterpret_cast безопасного получения значения указателя;
результат действительного преобразования целочисленного представления безопасного значения указателя;
значение объекта, значение которого было скопировано из отслеживаемого объекта-указателя, где во время копирования исходный объект содержал целочисленное представление безопасно полученного значения указателя;
результат аддитивной или побитовой операции, один из операндов которой является целочисленным представлением безопасно полученного значения указателя P, если этот результат, преобразованный с помощью, reinterpret_cast<void*> будет сравниваться с безопасным полученным указателем, вычисляемым из reinterpret_cast<void*>(P).
Реализация может иметь relaxed pointer safety, и в этом случае действительность значения указателя не зависит от того, является ли это безопасным значением указателя. В качестве альтернативы, реализация может иметь strict pointer safety, и в этом случае значение указателя, относящееся к объекту с длительностью динамического хранения, которое не является безопасным значением указателя, является недопустимым значением указателя, если указанный полный объект не был ранее объявлен достижимым ([util.dynamic.safety]). [ Note: Эффект от использования недопустимого значения указателя (включая передачу его в функцию освобождения) не определен, см [basic.stc.dynamic.deallocation]. Это верно, даже если значение указателя, полученное небезопасно, может сравниться с некоторым значением указателя, полученным безопасным способом. ] Это определяется реализацией, имеет ли реализация ослабленную или строгую безопасность указателя. — end note
Этот раздел не налагает ограничений на косвенное обращение через указатели к памяти, не выделенной ::operator new. Это поддерживает способность многих реализаций C ++ использовать двоичные библиотеки и компоненты, написанные на других языках. В частности, это относится к двоичным файлам C, потому что косвенное обращение через указатели к памяти, выделенной им std::malloc , не ограничено.