v
Size: a a a
AK
v
'==': no conversion from 'R' to '_Ty1'
не SFINAE-friendly, может такое быть? И как это можно выяснить, где-то есть перечень типов ошибок?DF
DF
A
template <typename L, typename R, typename = std::void_t<>>
struct is_equal_comparable {
static constexpr bool value = false;
};
template <typename L, typename R>
struct is_equal_comparable<L, R, std::void_t<decltype(std::declval<L>() == std::declval<R>())>> {
static constexpr bool value = true;
};
A
std::void_t<>
- это void
. std::void_t<decltype(whatever)>
- тоже войд. Как минимум эти две специализации идентичны и должна быть ошибка, как максимум - отвалится та, где whatever
не вычислимо, и тогда кажется, что здесь перепутаны ветки true и false. Но по факту это работает правильно, а я ничего не понимаю.v
std::void_t<>
- это void
. std::void_t<decltype(whatever)>
- тоже войд. Как минимум эти две специализации идентичны и должна быть ошибка, как максимум - отвалится та, где whatever
не вычислимо, и тогда кажется, что здесь перепутаны ветки true и false. Но по факту это работает правильно, а я ничего не понимаю.v
std::void_t<>
- это void
. std::void_t<decltype(whatever)>
- тоже войд. Как минимум эти две специализации идентичны и должна быть ошибка, как максимум - отвалится та, где whatever
не вычислимо, и тогда кажется, что здесь перепутаны ветки true и false. Но по факту это работает правильно, а я ничего не понимаю.v
template <typename L, typename R, typename = std::void_t<>>
struct is_equal_comparable {
static constexpr bool value = false;
};
template <typename L, typename R>
struct is_equal_comparable<L, R, std::void_t<decltype(std::declval<L>() == std::declval<R>())>> {
static constexpr bool value = true;
};
A