Когда будет std :: is_convertible_vбыть ложным? - PullRequest
4 голосов
/ 06 ноября 2019

Я читал правила конструкторов для std::pair (как описано в cppreference ), когда натолкнулся на это постановление:

Этот конструктор является явным, если и толькоесли std::is_convertible_v<const first_type&, first_type> равно false или std::is_convertible_v<const second_type&, second_type> равно false.

std::is_convertible_v<From, To> равно true, если From неявно преобразуется в To, и false, еслиэто не тот случай.

Но при каких обстоятельствах случай, подобный std::is_convertible_v<const T &, T>, будет false? Я думал об этом некоторое время, и я не могу придумать ничего лишнего. Мне кажется, что ссылка на константное значение типа T всегда может быть преобразована в значение типа T.

1 Ответ

3 голосов
/ 06 ноября 2019

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.

...