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

时间:2019-03-20 18:15:25

标签: c++ c++17 std-variant

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

3 个答案:

答案 0 :(得分:7)

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

std::variant的给定实例在且仅当它们具有相同的变体替代方案且所述替代方案的值比较相等时,才与另一个实例进行比较。

因此,具有std::variant<int, int>为0的index()与具有std::variant<int, int>为1的index()不等于,尽管有效的替代方案具有相同的类型和相同的值。

因此,该标准未实现通用的“与T比较”。但是,您可以使用<variant>标头中的其他帮助程序实用程序(例如std::holds_alternativestd::get<T>)来设计自己的比较运算符重载。

答案 1 :(得分:2)

我无法回答问题的为什么部分,但是由于您认为能够将std::variant<T1, T2>T1或{{ 1}},也许可以帮忙:

T2

答案 2 :(得分:0)

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

好,不是任意的 。关键是您具有比较严格的scale * ,其中包括:

  • 最严格:只有变体可以彼此相等,并且它们必须在替代序列(即类型),实际替代项(实际上是索引)中都匹配,因为您可以有多个相同类型替代品)和价值。
  • Less-Strict(最小严格):变量替代项(作为类型和值)相等,但不等同于替代序列,也不等同于该序列内的索引(因此,相同类型的两个不同替代项中的值相同相等)。
  • 最放松:主动替代项中的值相等,并在相关时隐式转换元素之一。

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

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