I think we're getting to the point where C++ users should define two classes:
class Integer {
// uses unsigned integers for all operations
// but converts to signed when you need output
};
class Pointer {
// uses void* and memcpy for all loads or stores
};
Put all of the correct operator overloading on those to get the ergonomics we had in the 90s.Then we can safely ignore all the undefined behavior which has been so eagerly embraced by the compiler writers, and we can go back to treating the hardware as though it is sane. (Which the hardware is desperately trying to fake being anyways)
After that, we can create some sane container types which don't offer up dangling references or pointers, and Bob's your uncle.