I found it surprising or unintuitive that the !() is required, and I do want to know what is the reasoning behind it
I don't know whether the language could be changed to support code like:
struct Foo(){} Foo foo;but doing that certainly would introduce some ambiguities. For example, consider this line:
alias Foo Bar; Should Bar be a template or an instance of a template here?