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

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

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

一个变体可能有多个相同类型的副本。例如。 std::variant<int, int>.

std::variant 的一个给定实例与另一个比较相等,当且仅当它们持有相同的变体备选方案并且所述备选方案的值比较相等。

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

因此,标准未实现通用 "compare to T"。但是,您可以使用 <variant> header 中的其他辅助实用程序(例如 std::holds_alternativestd::get<T>)自由设计自己的比较运算符重载。

这是标准委员会的武断决定。

好吧,不是相当任意。关键是你有一个比较严格的尺度*,比如:

  • 最严格:只有变体可以彼此相等,并且它们需要在替代序列(即类型)、实际替代(索引,真的,因为你可以有多个相同的-类型替代品)和价值。
  • 不太严格:作为类型和值的变体替代方案相等,但不是替代方案序列,也不是该序列中的索引(因此两个不同替代方案中的相同值相同的类型将是相等的)。
  • 最宽松:活动替代项中的值相等,如果相关,则隐式转换其中一个元素。

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

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

我无法回答问题的 为什么 部分,但因为您认为能够将 std::variant<T1, T2> 与 [=12] 进行比较会很有用=] 或 T2,也许这可以帮助:

template<typename T, class... Types>
inline bool operator==(const T& t, const std::variant<Types...>& v) {
    const T* c = std::get_if<T>(&v);
    if(c)
        return *c == t;
    else
        return false;
}

template<typename T, class... Types>
inline bool operator==(const std::variant<Types...>& v, const T& t) {
    return t == v;
}