Я изучаю этот увлекательный ответ на тонкий вопрос относительно лучшей практики для реализации swap
для пользовательских типов. (Мой вопрос изначально был мотивирован обсуждением незаконности добавления типов в пространство имен std
.)
Я не буду повторно распечатывать фрагмент кода из приведенного выше ответа.
Вместо этого я хотел бы понять ответ.
Ответ, который я связал выше, находится под первым фрагментом кода в отношении перегрузки swap
в namespace std
(вместо того, чтобы специализировать его в этом пространстве имен):
Если ваш компилятор печатает что-то другое, то это не правильно реализуя "двухфазный поиск" для шаблонов.
Далее следует отметить, что , специализирующийся на swap
в namespace std
(в отличие от перегрузки) создает другой результат (желаемый результат в случай специализации).
Однако в ответе идет дополнительный случай: специализированный swap для пользовательского класса шаблонов - в этом случае, опять же, желаемый результат не достигается.
К сожалению, ответ просто формулирует факты; он не объясняет почему.
Может кто-то прокомментировать этот ответ и описать процесс поиска в двух конкретных фрагментах кода, представленных в этом ответе:
-
перегрузка
swap
вnamespace std
для пользовательского класса без шаблона (как в первом фрагменте кода связанного ответа) -
специализируется
swap
вnamespace std
для пользовательского класса шаблонов (как в последнем фрагменте кода связанного ответа)
В обоих случаях генерируется общий std::swap
, а не пользовательский swap
. Почему?
(Это прояснит характер двухфазного поиска и причину лучшей практики для реализации пользовательского swap
; спасибо.)