Let us first consider what happens when function overloading is specified. The compiler will search for an ambigous call during compilation so we straight off the bat can eliminate run time errors and strictly adhere is dry semantics at this point. The compiler will only complain about an ambigous call when performing parameter matching in overloaded functions. During function overloading the compiler will generate candidate functions to form a candidate set. The candidate set is generated following function loading semantics, in which the function parameters are sequentially checked and the infered/implied function parameters also follow likewise analysis. At this point if the function parameter types are cast to another type or decay (a cast in which the parameter type decays in value) to another type according to parameter selection semantics. The overlap in the stated overload functions in the candidate set will not cause the compiler to throw an ambiguous call warning. The function overload selection will defer to the overload which requires the least overhead in execution. In essence the pointer overload is prefered as it ranks higher in the priority ranking list, (the pointer type is not a user defined type). I've tried to go into some amout on details about the semantics the compiler goes threough when it ranks priority. Hope this hhelps.