Ответ 1
- Это делает его менее специализированным, чем
std::swap
, поэтому вы не получаете ошибок неоднозначности при перегрузке, когда вstd::swap
иboost::swap
присутствуют (std::swap
). - Нет, не-шаблоны всегда имеют приоритет над шаблонами во время разрешения перегрузки, поэтому не-шаблон
swap
с пространством имен будет иметь приоритет как дляboost::swap
, так иstd::swap
(как и шаблон с областью именswap
перегружен для UDT, думаю, частично-специализированный, но не совсем.). Обратите внимание, что в отличие отstd::swap
,boost::swap
явно написано, чтобы воспользоваться ADL.
Вот что должен сказать стандарт С++ 03 относительно обеих точек – [over.match.best] (§13.3.3/1):
Определите ICS i (
F
) следующим образом:
- Если
F
является статической функцией-членом, ICS 1 (F
) определяется так, что ICS 1 (F
) не лучше и не хуже чем ICS 1 (G
) для любой функцииG
, и, симметрично, ICS 1 (G
) не лучше и не хуже, чем ICS 1 (F
); в противном случае,- пусть ICS i (
F
) обозначает неявную последовательность преобразований, которая преобразует i-й аргумент в список в тип i-го параметра жизнеспособной функцииF
. 13.3.3.1 определяет неявные последовательности преобразований, а 13.3.3.2 определяет, что означает, что одна неявная последовательность преобразований является лучшей последовательностью преобразования или худшей последовательностью преобразования, чем другая.Учитывая эти определения, жизнеспособная функция
F1
определяется как лучшая функция, чем другая жизнеспособная функцияF2
, если для всех аргументов i, ICS i (F1
) не является хуже, чем ICS i (F2
), а затем
- для некоторого аргумента j, ICS j (
F1
) является лучшей последовательностью преобразования, чем ICS j (F2
), или, если не тот,F1
- это не шаблонная функция, аF2
- специализированная функция шаблона или, если не это,F1
иF2
- специализированные шаблоны шаблонов функций, а шаблон функции дляF1
более специализирован, чем шаблон дляF2
в соответствии с правилами частичного упорядочения, описанными в 14.5.5.2, или, если это не так- контекст представляет собой инициализацию путем пользовательского преобразования (см. 8.5, 13.3.1.5 и 13.3.1.6) и стандартную последовательность преобразования из возвращаемого типа
F1
в тип назначения (т.е. тип объект, инициализированный) является лучшей последовательностью преобразования, чем стандартная последовательность преобразования из возвращаемого типаF2
в тип назначения.