It's probably worth mentioning: The rule in C++ is that if something can
be a function declaration, it is one.
The () operator isn't being overloaded here.
If you were to write
the issue is that this looks like a function declaration to the compiler (a function that takes in no arguments and returns a Timer) and therefore it is one. The solution here is that no-arg constructors (when used on a named object) should not use parentheses.
This is actually kinda nice, because it lets you do
However, in the case of temporaries, you can call
like it was called in the previous example, because there is no ambiguity as to whether or not it is a function declaration.
This also leads to issues like "the most vexing parse".