The default value in CSettingLevel is a default initializer, quite honestly meant to shut up compilers/analyzers. From what I understand no contract exists that guarantees m_level has to be in its default state prior to CSetting::Deserialize() being called. For this reason, CSetting::Deserialize() has to deserialize m_level somehow, either SetLevel() or Dserialize().

In regards to your comment, what do you think about encapsulating the default level logic inside CSettingLevel class: https://github.com/garbear/xbmc/commit/8467a9224b32fb2b19ed18b0d96b748fbd0134af? It has the advantage that a single #define in a header is no longer used as a default (unused) initializer in the body source file and a default value in another source file.

I squashed all commits including the unpushed https://github.com/garbear/xbmc/commit/8467a9224b32fb2b19ed18b0d96b748fbd0134af into https://github.com/garbear/xbmc/commit/7499b07504558690af6e1efb2cab0c3d076171d3 (to avoid rebasing and nuking our comments) if you wanna check it out