C++ Templates: The Complete Guide

Ru-Brd

Overload resolution is just one part of the complete processing of a function call. In fact, it is not part of every function call. First, calls through function pointers and calls through pointers to member functions are not subject to overload resolution because the function to call is entirely determined (at run time) by the pointers. Second, function-like macros cannot be overloaded and are therefore not subject to overload resolution.

At a very high level, a call to a named function can be processed in the following way:

  • The name is looked up to form an initial overload set .

  • If necessary, this set is tweaked in various ways (for example, template deduction occurs).

  • Any candidate that doesn't match the call at all (even after considering implicit conversions and default arguments) is eliminated from the overload set. This results in a set of so-called viable function candidates .

  • Overload resolution is performed to find a best candidate. If there is one, it is selected; otherwise , the call is ambiguous.

  • The selected candidate is checked. For example, if it is an inaccessible private member, a diagnostic is issued.

Each of these steps has its own subtleties, but overload resolution is arguably the most complex. Fortunately, a few simple principles clarify the majority of situations. We examine these principles next .

Ru-Brd

Категории