In C++, pointers generally have a lot more functionality associated with them than is really necessary. A class template that wraps a pointer and removes most of the less-used features (arithmetic, indexing, deletion). Each function could then decide how powerful a pointer it requires and take the appropriate type.
Would using such types make sense in an actual project, though? Are errors caused by unintentional arithmetic/deletion common enough to justify the additional effort?
To clarify: I am considering this as a system alongside existing
unique_ptr -- those three are great when ownership is involved, but sometimes non-owning nullable or reseatable references are useful.