¿Se puede usar std :: uintptr_t para evitar el comportamiento indefinido de la aritmética de puntero fuera de los límites?

Ahora sabemos que hacer aritmética de puntero fuera de límites tiene un comportamiento indefinido como se describe en esteSO pregunta.

Mi pregunta es: ¿podemos solucionar tal restricción mediante la conversión a std :: uintptr_t para operaciones aritméticas y luego volver al puntero? ¿eso está garantizado para trabajar?

Por ejemplo:

char a[5];
auto u = reinterpret_cast<std::uintptr_t>(a) - 1;
auto p = reinterpret_cast<char*>(u + 1); // OK?

El uso en el mundo real es para optimizar el acceso de memoria compensada, en lugar dep[n + offset], Quiero haceroffset_p[n].

EDITAR Para hacer la pregunta más explícita:

Dado un puntero basep de una matriz de caracteres, sip + n es un puntero válidoreinterpret_cast<char*>(reinterpret_cast<std::uintptr_t>(p) + n) estar garantizado para producir el mismo puntero válido?

Respuestas a la pregunta(2)

Su respuesta a la pregunta