Можно ли использовать std :: uintptr_t, чтобы избежать неопределенного поведения арифметики с указателями вне границ?

Теперь мы знаем, что выполнение арифметики вне пределов указателя имеет неопределенное поведение, как описано в этомТАК вопрос.

Мой вопрос: можем ли мы обойти такое ограничение, приведя к std :: uintptr_t для арифметических операций, а затем приведя обратно к указателю? это гарантированно сработает?

Например:

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

Реальное использование для оптимизации смещенного доступа к памяти - вместоp[n + offset], Я хочу делатьoffset_p[n].

РЕДАКТИРОВАТЬ Чтобы сделать вопрос более явным:

Учитывая базовый указательp из массива символов, еслиp + n является действительным указателем, будетreinterpret_cast<char*>(reinterpret_cast<std::uintptr_t>(p) + n) гарантированно выдать тот же действительный указатель?

Ответы на вопрос(2)

Ваш ответ на вопрос