I wrote a couple of days ago to Eric Niebler about the same issue, and he tolds me that the risk "is not so big". My points were:
- Namespaces were born to avoid name conflicts, and customization points takes alternative paths to remove them
There is some risk, yes, although I think it's small. The boost range library chose to call it's range-related customization points `range_begin` and `range_end` for this reason. I expect the number of genuine std-related customization points to be small. `swap`, `begin`, `end`, `size`, `iter_swap`, `iter_move` is the current list, I think. We can live with telling users not to define free functions called that. As for customization points defined by 3rd party libs, a solution like you suggest or like the one used by Boost would be worthwhile.
- Standard customization points work like keywords to the language due to name conflicts
To a limited extent. Users are free to have functions begin and end that take more than one argument, for instance. But yes, for all intents and purposes, swap has been a keyword since C++98, and begin and end since ... TR1? I haven't heard cries of outrage, have you?
I'm far from being a C++ expert but in my understanding I agree that the issue maybe is not big. Only by recommending 3rd party libraries to don't use those names with that exact number of parameters would be enough, as far as the number of customization points is kept short.
Anyway, the solution I purposed was just to add and extra parameter of type, std::tag, for example, or std::customize inheriting from std::tag (imitating the phylosophy of std::exception and its hierarchy), to make the source namespace present as a last user's customization point parameter (which will remove the need of "poison pills" too).
Besides, a standard tag hierarchy could open new possibilities, like adding the concept check within the tags. That way, users, even learners, can test in a very easy way if its types meet the requirements just by instantiating the corresponding concept tag with its own type and see the generated compiler errors, which can besides be used for making simpler to end users write overloads by concepts instead of by type.