No, that's a good feature of the C++ type system, because it (effectively) allows the programmer to construct a value of type Badge<Device>, even if Device thinks it's okay to prevent that.
It would be better to do eg "return Device::private:get_badge()", but C++ defectively doesn't support that.
It would be better to do eg "return Device::private:get_badge()", but C++ defectively doesn't support that.