C++ 为什么std::equality\u Compariable不适用于std::vector

C++ 为什么std::equality\u Compariable不适用于std::vector,c++,stdvector,c++20,c++-concepts,C++,Stdvector,C++20,C++ Concepts,我在玩弄概念,期望std::与vector的工作相当,但它不是 #include <type_traits> #include <vector> #include <concepts> struct X {}; template<std::equality_comparable T> bool foo( T v){ return v == v; } int main() { foo(10); foo(std::vec

我在玩弄概念,期望std::与vector的工作相当,但它不是

#include <type_traits>
#include <vector>
#include <concepts>


struct X {};

template<std::equality_comparable T>
bool foo( T v){
    return v == v;
}

int main()
{
    foo(10);
    foo(std::vector<X>{});
    
}
#包括
#包括
#包括
结构X{};
模板
布尔福(电视){
返回v==v;
}
int main()
{
傅(10),;
foo(std::vector{});
}
编译错误在
foo
内部失败,而不是在受概念保护的函数边界处失败


这是错误还是预期行为?

概念只检查声明的格式是否正确,而不检查定义

for
std::vector
不是SFINAE友好的,即它们是无条件声明的,这意味着
操作符==(vector,vector)
始终存在,即使
操作符==(T,T)
不存在。这就是为什么
equality\u comparable
总是令人满意的原因,并且在函数内部的
v==v
上会出现错误

为使其正常工作,向量比较运算符应受到约束,即:

template< class T, class Alloc >
    requires std::equality_comparable<T>
constexpr ret_type operator==( const std::vector<T,Alloc>& lhs,
                                       const std::vector<T,Alloc>& rhs );
模板
需要std::equality\u Compariable
constexpr ret_type运算符==(const std::vector和lhs,
const std::vector&rhs);

因为
X
不相等\u对不起,我不清楚。我知道X是不可比的。然而,这也意味着std::vector不具有可比性。我希望它在那里失败,而不是在向量的实现中失败。向量比较运算符不是SFINAE友好的,也就是说,它们是无条件定义的,使
vector
满足
equality\u可比的
概念,即使你不能比较它们。要使它失败,向量的操作符必须声明为SFINAE友好。这是目前不需要的。我还没有看到一个。但我现在很长一段时间都没有密切关注。对标准库的操作员模板进行概念化当然很有意义。要在std::library中修复此问题,是否需要对标准规范进行更改,或者是否未定义每个供应商gcc/clang/msvc是否应该/将修复此问题?@bradgon标准。注意,我编写了一个定制特征,通过测试tyoe T而不是T的向量来处理这种常见情况,并返回到正常特征。