Using braces in the initializer gives the members a value of zero.
Using an empty initializer does not initialize the members, leaving them with a garbage value that cannot be used in a correct C++ program.
The thing is the syntax of the default initialization you refer on cppreference.com DOES NOT use the '=' operator.
Notice the '=' operator:
product apple = {};
WNDCLASS wc = { };
according to cppreference.com you mustn't use the '=' operator, so what does that '=' operator mean?. Where is it referred within the C++ official specification (for the case of default initialization)?
Even Microsoft won't introduce the '=' operator for default initialization (and so the '='-free default initialization should work, but it doesn't)! It's really annoying.
EDIT: --------------------------------
The following piece of code works right on Visual Studio but NOT on Code::Blocks (notice the circle structure uses a constructor) ...
The thing is the syntax of the default initialization you refer on cppreference.com DOES NOT use the '=' operator.
Because the class is an aggregate, it is aggregate-initialized and not default-initialized. The page about aggregate initialization discusses the relevant syntax.
Notice that the initializer is = {}, not merely the stuff inside the (empty) braces; an example of a declaration with no initializer would be product apple; and not product apple = {};.
Where is it referred within the C++ official specification