Wrapping a non-unique handle with additional information
Because I also had to deal with a lot of handles, used by for example the Win32 API, I really can understand your use case.


  Is it safe to do this? (i.e. have I missed an operator or something?)


I don't think so, for a lot of reasons: Let's assume the handle your library defines is an opaque type, usually a void*. So the first problem is that the C-library has no idea of C++ concepts like operator overloading. So it will not call your operator= i.e. nor will the compiler disallow to assign named instances. Furthermore the library will deference your handle, assuming it points to it's internal data structure of some kind. Also the compiler has no idea that you have given the library a instance different from handle, while translating the library code. So even compiling the library with a C++ compiler won't make a difference.


  Is there another way to do this?


Although you're desire to design a nice C++ wrapper is a good idea, I would drop the idea to slip the C-library your type. I recommend to just define a .native_handle() member function or overload the operator* but then I would suggest that the name of your type does stress the wrapper nature more.


  Is there any good reason not to do this?


Despite from the reasons above, the size would already change if someone would sub or base class it.