为什么不允许 std::variant 与其替代类型之一相等?
Why isn't std::variant allowed to equal compare with one of its alternative types?
例如,将std::variant<T1, T2>
与T1
或T2
进行比较应该非常有帮助。到目前为止,我们只能与相同的变体类型进行比较。
变体可能具有相同类型的多个重复。例如。std::variant<int, int>
。
std::variant
的给定实例与另一个相等的情况相等,并且仅当它们拥有相同的变体替代方案并说替代的值比较相等。
因此,具有index()
0的std::variant<int, int>
比较与index()
1的std::variant<int, int>
相比,尽管有活动的变体替代品为相同类型和相同的值。
因此,标准未实现通用的"与T
相比"。但是,您可以使用<variant>
标头中的其他助手实用程序(例如std::holds_alternative
和std::get<T>
)自由设计自己的比较操作员超载。
我无法回答问题的一部分,但是由于您认为能够将std::variant<T1, T2>
与T1
或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);
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
提案,也许说明这些条件是什么。
(*) - 实际上是一个晶格。
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 与'operator<<'不匹配(操作数类型'std::ostream {aka std::basic_ostream<char>}'
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 包括<字符串>,使用不完整的类型"std::string"
- 与"operator<<"不匹配(操作数类型'std::ostream'
- 错误:类型"std::__1::basic_string<char>"不提供呼叫运算符
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- CLion 无法解析类型 std::unordered_map,即使它提示我包含标头并且编译工作
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 返回类型 std::optional<std::variant<...>>
- 变量具有不完整的类型std :: String;string.h有很多错误
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::
- 类型"std::array<char,6>"和"char"不兼容
- 此错误的含义是什么:从 'char* [40] 转换为非标量类型 'std::string
- 使用 TypedEq() 匹配类型 std::vector<std::vector>
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"