Исходя из этого ответа , кажется, что этим конструкторам:
template<class U, class V> pair(pair<U, V>&& p);
template<class U, class V> pair(const pair<U, V>& p);
запрещено участвовать в разрешении перегрузки, когда им потребуется явное преобразование.
Из C ++ 11 (§20.3.2, n3290):
Примечание: Этот конструктор не должен участвовать в разрешении перегрузки, если U неявно преобразуется в first_type, а V неявно преобразуется в second_type.
Был предложен интересный SFINAE обходной путь , но это отступает от текста стандарта.
Как соответствующая реализация может исключить это из разрешения перегрузкиесли не считать какой-то особой внутренней магии компилятора?Т.е. может ли реализация сделать это, и я могу скопировать это для моего собственного типа, возможно?Похоже, что в любом случае не соответствует этому!Это похмелье от удаления концепций из C ++ 11?
Я задумался об использовании частного конструктора для выполнения части SFINAE и делегировании из открытого конструктора, но это не похоже на делегирование конструктораучаствует в SFINAE таким образом, чтобы заставить эту работу.