Это действительно должен быть комментарий, но я предпочитаю, чтобы какое-то место было напечатано.
Итак, допустим, у нас есть два типа:
typedef std::pair<A,B> pairAB;
typedef std::pair<S,T> pairST;
Теперь я хочу назначить одинк другому:
pairAB x;
pairST w;
x = w; // how?
Поскольку std::pair
не имеет явного оператора присвоения, мы можем использовать только присвоение по умолчанию pairAB & operator=(const pairAB &)
.Таким образом, мы вызываем неявный конструктор преобразования, который эквивалентен:
x = pairAB(w); // this happens when we say "x = w;"
Однако, как уже отмечалось, этот конструктор преобразования вызывает явные конструкторы-члены:
pairAB(const pairST & other) : first(other.first), second(other.second) { }
Таким образом, для каждого члена в отдельности мы используем явное преобразование.