A type which goes unused will be something the compiler can safely ignore. The standard of course says nothing about how much room things take, but any compiler worth using will eliminate unused types. Or functions. Or any other thing that never actually gets used.
However, unused in the above case means unusued: no code anywhere uses that name. The compiler still must note that the name exists, and if someone else tries to declare a class with that name whose definition is different, you get an ODR violation. Which compilers don't have to report.
Even if a type is never used to declare an object, the compiler may have to generate some data about it if you do use the name. For example, if you invoke typeid
upon this name. The compiler will have to statically create type information about it that gets bundled into your executable.