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
Timer timer();
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
Timer timer;
just like
int a;
However, in the case of temporaries, you can call
Timer();
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".
https://en.wikipedia.org/wiki/Most_vexing_parse