A Customization Point is a function used by the Standard Library (or any library for that matter) which can be overloaded for user’s type in the user’s namespace. The function is then found throught Argument Dependent Lookup (ADL).

The current customization points in the standard library are:

  • swap
  • begin
  • end

The correct use of a customization point is to bring the std version into scope and then calling the function unqualified so the proper function is called through ADL.

using begin = std::begin;
begin(s);

However, calling std::begin would not be able to find user defined overloads in their namespace. This means that for a function begin defined in the std library, using std::begin would not lookup user defined functions.

This is solved by making a customization point a struct which does ADL on user’s behalf. In that way, even calling it qualified will result in the proper ADL call.