Open Peas-Li opened 1 week ago
is_convertible<const U1&, Ty1>
与 is_convertible<U1, Ty1>
含义确实不一样。
其实,只有pair的两个参数被实例化为引用类型即,pair<int&, double&>,第一个构造函数才会被调用,而此时U和T都为引用类型,在std::is_convertible<const U1&, Ty1>::value中的const U1&,const只是顶层const,给引用类型加顶层const并没用,所以std::is_convertible<const U1&, Ty1>::value = 1,也就是说此时同样的std::is_convertible<U1, Ty1>::value = 1,所以 虽然is_convertible<const U1&, Ty1> 与 is_convertible<U1, Ty1> 含义确实不一样,但是在这里编译器认为它们的含义一样
template <class U1 = Ty1, class U2 = Ty2, typename std::enable_if< std::is_copy_constructible::value &&
std::is_copy_constructible::value &&
std::is_convertible<const U1&, Ty1>::value &&
std::is_convertible<const U2&, Ty2>::value, int>::type = 0>
constexpr pair(const Ty1& a, const Ty2& b)
: first(a), second(b)
{
}
// explicit constructible for this type template <class U1 = Ty1, class U2 = Ty2, typename std::enable_if< std::is_copy_constructible::value &&
std::is_copy_constructible::value &&
(!std::is_convertible<const U1&, Ty1>::value ||
!std::is_convertible<const U2&, Ty2>::value), int>::type = 0>
explicit constexpr pair(const Ty1& a, const Ty2& b)
: first(a), second(b)
{
}