template <typename T>
concept HasEq = requires(T t) {
{ t == t } -> std::convertible_to<bool>;
};
struct X {};
static_assert(not HasEq<X>);
//bool a = pair<X, X>{} == pair<X, X>{};
static_assert(! HasEq<pair<X, X>>); // fails! SIGH
我想定义一个概念“T具有==的支持”应该是足够简单的。而且定义一个不支持operator==的类型“X”也很简单。对于这个概念,似乎一切都运行良好。
但是让人困惑的是pair实际上并不支持operator==(因为它委托给了不存在的X operator==)。
然而,HasEq>返回了错误的答案(它说operator==已经定义)。
这似乎是std C++对operator==(pair,pair)的定义中的一个bug,它无条件地定义了operator==,而没有在operator==的定义中使用'enable_if'或'requires'。但我真的不确定我能做什么来使HasEq正常工作(所以首先要弄清楚这是否真的是std::pair operator==定义中的一个缺陷)。
std::pair<T1, T2>::operator==
确实不友好地支持 SFINAE。 - Jarod42std::pair<T1, T2>::operator==
确实不太友好于 SFINAE。 - Jarod42std::pair<T1, T2>::operator==
确实不太友好于 SFINAE。 - undefinedstd::pair::operator==
在标准规范中要求的。如果要使其按您期望的方式工作,则需要修改标准,使其符合SFINAE(例如通过LWG问题)。 - user17732522std::pair::operator==
在标准规范中要求的。要使其按照你期望的方式工作,需要修改标准以使其符合SFINAE(例如通过LWG问题)。 - user17732522