std::is_convertible_v
проверяет неявное преобразование. std::is_convertible_v<const T &, T>
возвращает true
, если существует неявный конструктор копирования для T
.
struct S {
explicit S(const S &) = default;
};
S
имеет явный конструктор копирования, поэтому std::is_copy_constructible_v<S>
равно true
но std::is_convertible_v<const S &, S>
- это false
. Конструктор копирования std::pair
должен быть explicit
, чтобы соответствовать конструктору копирования first_type
, поэтому имеет смысл, чтобы конструктор копирования std::pair
был explicit
, когда std::is_convertible_v<const first_type &, first_type>
равен false
.