First one is initialization. It is a way to provide your own initialization routine instead of relying on them being default-initialized (as some types do not have default constructors or they are costly)
After you enter constructor body, all member variables are initialized. It is impossible to initialize variable second time. Now you can properly use it: call member function, access fields, etc.
Your second example calls operator()(int) on m_i. If m_i does not have one, it is a compiler error.
If I understand right, in the second constructor in the post above, the parenthesis represent an early initialization. The parenthesis inside the constructor represent an operator? Something totally different is going on?
in the second constructor in the post above, the parenthesis represent an early initialization
It just initialization. Not early, it happens exactly when standard requires it: before the body of constructor. As you might want or even need to initialize members in specific ways, there is member initialization list — to provide your own initialization for members.
In the body of constructor members are already initialized. There is no special handling like there is for declaration statement: for declaration stuff like
1 2 3
foo bar = baz;
foo bar(baz);
foo bar {baz};
all means initialize bar with baz (with some differences).
In normal variable handling, bar = baz is assigment, bar(baz) invokes function call operator, and bar{baz} makes no sense.
Another example:
1 2
int i(10); //Works fine: initialization
i(10); //Error, normal handling, there is no operator()(int)