A candidate function is a function with the same name as the called function and for which a declaration is visible at the point of the call.
A viable function is a candidate function with the same number of parameters as there are arguments in the call, and the type of each argument must match or be convertible to the type of its corresponding parameter.