¿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&nbsp;Para hacer la pregunta más explícita:

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