Microsoft C++ fails to compile this:
error C2668: 'sqrt' : ambiguous call to overloaded function
...math.h(589): could be 'long double sqrt(long double)'
...math.h(541): or 'float sqrt(float)'
...math.h(127): or 'double sqrt(double)'
So, yes, they want a typecast on the ix parameter so they know if you want the float, double, or long double version of the function.
I would go with double myself:
cout << sqrt ((double)ix) << endl;
cout << pow (sqrt((double)ix), 2) << endl;
It's a bit questionable in my mind if they should fail this, but I'm not a C++ language cop, so can't say. Microsoft isn't always 100% standards compliant (except when they write the standard ;-)...but there is an ambiguity here. Not sure if the spec is 100% clear on how it should be resolved. (And way too lazy to search for it).
ETA: Just saw your last comment about implicit typecasts only. I can only think of 1 way to do that here:
cout << sqrt (ix + 0.0) << endl;
cout << pow (sqrt(ix + 0.0), 2) << endl;
Very ugly, but standard practice in Javascript. Not how I would do it in c*