Ответ 1
Оператор присваивания копий действительно неявно объявляется и рассматривается с помощью разрешения перегрузки.
Оператор копирования
X::operator=
, объявленный пользователем, является нестатическая функция без шаблона классаX
[..].
Если определение класса не указано явно объявить оператор присваивания копии, один объявлен неявно. [..] Оператор присваивания неявным объявлением для классаX
будет имеют видX& X::operator=(const X&)
если
- каждый прямой базовый класс
B
ofX
имеет оператор присваивания копии, параметр которого имеет типconst B&
,const volatile B&
илиB
и- для всех нестатических членов данных
X
, которые относятся к типу классаM
(или его массиву), каждый такой тип класса имеет назначение копирования оператор, параметр которого имеет типconst M&
,const volatile M&
илиM
.В противном случае, [..]
Как вы видите, неявно объявленный оператор назначения копирования для Pair<int>
имеет один параметр типа Pair<int> const&
- обратите внимание на const
в частности! Разрешение перегрузки поддерживает не const
ссылки на const
, если оба могут быть связаны с аргументом, [over.ics.rank]/3:
Две неявные последовательности преобразования одной и той же формы неразличимые последовательности преобразования, если одно из следующих применяются правила:
- Стандартная последовательность преобразования
S1
является лучшей последовательностью преобразования, чем стандартная последовательность преобразованияS2
если
- [..]
S1
иS2
являются привязками привязки (8.5.3) и типами, ссылки ссылаются на один и тот же тип, за исключением cv-квалификаторов верхнего уровня, и тип, на который ссылается ссылка, инициализированная наS2
, больше cv-квалификатор, чем тип, к которому ссылка инициализируетсяS1
относится.
Специализации шаблона не хватает const
в эталонном параметре, поэтому он лучше сочетается и выбирается.