【发布时间】:2021-03-12 11:05:55
【问题描述】:
我正在玩概念,并期望 std::is_equality_comparable 可以为向量工作,但它没有。
#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 内部失败,而不是在受概念保护的函数边界处失败。
这是错误还是预期行为?
【问题讨论】:
-
因为
X不是equal_comparable -
对不起,如果我不清楚。我知道 X 不是平等可比的。然而,这也意味着 std::vector
不是相等可比的。我希望它在那里失败,而不是在向量的实现中。 -
向量比较运算符对 SFINAE 不友好,即它们是无条件定义的,即使您无法比较它们,也使
vector<X>满足equality_comparable概念。 -
要使其失败,向量的运算符必须声明为 SFINAE 友好。目前不需要。
-
我还没见过。但我现在有一段时间没有密切关注了。将标准库的操作符模板概念化肯定会很有意义。
标签: c++ stdvector c++20 c++-concepts