O std :: uintptr_t pode ser usado para evitar um comportamento indefinido da aritmética de ponteiros fora dos limites?

Agora sabemos que fazer aritmética fora dos limites tem comportamento indefinido, conforme descrito nestePergunta SO.

Minha pergunta é: podemos solucionar essa restrição convertendo para std :: uintptr_t para operações aritméticas e depois lançando de volta para o ponteiro? isso é garantido para o trabalho?

Por exemplo:

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

O uso no mundo real é otimizar o acesso à memória deslocada - em vez dep[n + offset], Eu quero fazeroffset_p[n].

EDITAR Para tornar a pergunta mais explícita:

Dado um ponteiro basep de uma matriz de caracteres, sep + n é um ponteiro válido,reinterpret_cast<char*>(reinterpret_cast<std::uintptr_t>(p) + n) pode garantir o mesmo ponteiro válido?

questionAnswers(2)

yourAnswerToTheQuestion