the pointer prefix is because it's different from an actual instance and its usage is different.
Same for lvalue + rvalue references, smart pointers, optional objects, reference wrappers... Why should pointers get a special treatment?
Pointers end up changing the way the object is accessed ( . vs -> and *) and they are (I am) pretty clumsy so that's why
I use it here: to clarify to myself.
Since, semantically, smart pointers are pointers, I would also use the same prefix for that.
I must admit, though, that it's only because they are still likely to trip me up if I don't. I tend to not use pointers very often anyway, and raw ones are (almost) always for pointing to actual objects. I'm sure that, when I'm more used to pointers etc., I may remove the prefix from my own code.
That's one of the fundamental problems of HN: it's tailored to languages with a few, clearly distinct types. C++ has myriads of types and the boundaries are often blurred.
When I was investigating HN (I was looking at Windows Programming), I was drawn in by the 'original' idea of it: the usage type, rather than the data type. Windows, as is commonly known, uses the latter, and it's really ugly. I convinced myself to avoid it but found that those two specific cases mentioned above seem to improve my understanding of it more than it hinders it.
I'll stop using the p prefix in the future; I pPromise