I cannot say for sure since I have limited knowledge on the internals of the engine so take everything with a grain of salt.
I believe that creating a soft class reference to Character
as I suggested previously also creates a hard reference. So In a way you can say that. But the hard reference in that case goes to the Package that contains the native Character class instead. And since it is a package the reference chain likely stops there and won’t pull in as many additional dependencies.
However in the case of a class implemented in Blueprint the reference goes to the asset/package containing the Blueprint which in turn pulls in all the things the Blueprint depends on. That’s the case with your BP_Character class.
I suspect the reason for this hard reference from the struct is that the struct still needs to know the class that was selected when creating the soft class reference variable. After all it needs it to determine the available subclasses when you assign a (default) value to this member.
There’s been a similar discussion somewhat recently that contains a great link to an article that explains “Object references in Blueprints”. You can find the link in this post: Does 'Resolving' a Soft Class Reference to 'Get Class Defaults' Create a Hard Reference? - #10 by M0rph3u5_UK