为什么不允许 std::variant 与其替代类型之一相等?

Why isn't std::variant allowed to equal compare with one of its alternative types?

本文关键字:类型 std 不允许 variant 为什么      更新时间:2023-10-16

例如,将std::variant<T1, T2>T1T2进行比较应该非常有帮助。到目前为止,我们只能与相同的变体类型进行比较。

变体可能具有相同类型的多个重复。例如。std::variant<int, int>

std::variant的给定实例与另一个相等的情况相等,并且仅当它们拥有相同的变体替代方案并说替代的值比较相等。

因此,具有index() 0的std::variant<int, int>比较与index() 1的std::variant<int, int>相比,尽管有活动的变体替代品为相同类型和相同的值。

因此,标准未实现通用的"与T相比"。但是,您可以使用<variant>标头中的其他助手实用程序(例如std::holds_alternativestd::get<T>)自由设计自己的比较操作员超载。

我无法回答问题的一部分,但是由于您认为能够将std::variant<T1, T2>T1T2进行比较是有用的也许这可以有所帮助:

template<typename T, class... Types>
inline bool operator==(const T& t, const std::variant<Types...>& v) {
    const T* c = std::get_if<T>(&v);
    return c && *c == t; // true if v contains a T that compares equal to t
}
template<typename T, class... Types>
inline bool operator==(const std::variant<Types...>& v, const T& t) {
    return t == v;
}

这是标准委员会的任意决定。

好的,不是完全任意。关键是您有一个比较严格的量表*,诸如:

之类的点
  • 最严重的是:只有变体才能彼此平等,并且它们需要在隔离序列(即类型)中匹配实际替代方案(索引,实际上,因为您可以具有多个相同的类型替代品)和价值。
  • 较小的严格:变体替代方案的平等,是一种类型和值,但不是偏置序列的值,也不是该序列中的索引(因此在同一类型的两个不同的替代方案中相同的值将是相等的)。
  • 最终的删除:在活动替代方案中值的平等,如果相关的一个元素之一,则隐含的转换。

这些都是有效的选择。C 委员会根据各种外部标准做出了决定。尝试查找std::variant提案,也许说明这些条件是什么。

(*) - 实际上是一个晶格。

相关文章: