В реализации пары следующие два конструктора отличаются только префиксом: явный. функция шаблона с двумя членами почти одинакова.
template<class _Other1,
class _Other2,
enable_if_t<conjunction_v<
is_constructible<_Ty1, _Other1>,
is_constructible<_Ty2, _Other2>,
is_convertible<_Other1, _Ty1>,
is_convertible<_Other2, _Ty2>
>, int> = 0>
constexpr pair(_Other1&& _Val1, _Other2&& _Val2)
_NOEXCEPT_COND(is_nothrow_constructible_v<_Ty1, _Other1>
&& is_nothrow_constructible_v<_Ty2, _Other2>)
: first(_STD forward<_Other1>(_Val1)),
second(_STD forward<_Other2>(_Val2))
{ // construct from moved values
}
template<class _Other1,
class _Other2,
enable_if_t<conjunction_v<
is_constructible<_Ty1, _Other1>,
is_constructible<_Ty2, _Other2>,
negation<conjunction<
is_convertible<_Other1, _Ty1>,
is_convertible<_Other2, _Ty2>>>
>, int> = 0>
constexpr explicit pair(_Other1&& _Val1, _Other2&& _Val2)
_NOEXCEPT_COND(is_nothrow_constructible_v<_Ty1, _Other1>
&& is_nothrow_constructible_v<_Ty2, _Other2>)
: first(_STD forward<_Other1>(_Val1)),
second(_STD forward<_Other2>(_Val2))
{ // construct from moved values
}
Но когда я напишу свой тестовый пример следующим образом:
class A
{
public:
template<typename T1,typename T2>
A(T1 a,T2 b){}
template<typename T1,typename T2>
explicit A(T1 a,T2 b){}
};
Ошибка сборки выглядит так:
Error C2535 'A::A(T1,T2)': member function already defined
Так почему же результат отличается?