You could maybe ease transition for people that rely on this behavior via: import std.traits;
auto sqrt(F, T)(T x) { return sqrt(cast(F)x); } auto sqrt(F)(F f) if (!isIntegral!F) { return sqrt(f); } void main() { int x = 1; sqrt(4); // ng sqrt!float(x); // ok sqrt(4.5); // ok } It sure is shorter to type than cast(float). Then again it's templated so maybe that's not too nice for std.math.