gpt4 book ai didi

c++ - 为什么 std::equality_comparable 不适用于 std::vector

转载 作者:行者123 更新时间:2023-12-05 02:44:04 24 4
gpt4 key购买 nike

https://godbolt.org/z/P97MaK

我正在玩弄概念,并期望 std::is_equality_comparable 对 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>{});

}

编译错误在 foo 内部失败,而不是在概念保护的函数边界处失败。

enter image description here

这是错误还是预期的行为?

最佳答案

概念仅检查声明是否格式正确,不检查定义。

comparison operators对于 std::vector不是 SFINAE 友好的,即它们是无条件声明的,这意味着 operator==(vector<T>, vector<T>)始终存在,即使 operator==(T, T)不存在。这就是为什么 equality_comparable<std::vector<T>>总是很满意,你会在 v == v 上出错在函数内部。

为了使其正常工作,应限制 vector 比较运算符,即:

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 );

关于c++ - 为什么 std::equality_comparable 不适用于 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66598738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com