与 std::map 比较的操作数顺序
Order of operands in compare with std::map
假设我有:
bool operator<(Type const& lhs, Type const& rhs) { /* ... */ }
std::map<Type, void*> m;
如果我现在做
Type t{};
m.find(t);
将 t
总是在 operator<
的左侧参数中结束,并且 m
的元素在右侧参数中与之进行比较(反之亦然)反过来)?
或者这个实现是依赖的并且可以采用任何一种方式?
如果我没记错的话,可以证明存在必须两面都评估的情况。这是因为数学等式
a = b
(字典最终必须决定)是通过
模拟的
不是 (a < b) 也不是 (b < a)。
这两种方式都没有明确的保证,在实践中你可以期望在比较的两边找到你的操作数,因为操作最终需要观察 ¬(A<B) && ¬(B<A)
来确定 [=11= 之间的相等性] 和 B
.
使您的运算符尽可能抽象,这样就没有关系了。让它只考虑它接收到的两个参数的值,而不考虑任何容器或查找操作。
假设我有:
bool operator<(Type const& lhs, Type const& rhs) { /* ... */ }
std::map<Type, void*> m;
如果我现在做
Type t{};
m.find(t);
将 t
总是在 operator<
的左侧参数中结束,并且 m
的元素在右侧参数中与之进行比较(反之亦然)反过来)?
或者这个实现是依赖的并且可以采用任何一种方式?
如果我没记错的话,可以证明存在必须两面都评估的情况。这是因为数学等式
a = b
(字典最终必须决定)是通过
模拟的不是 (a < b) 也不是 (b < a)。
这两种方式都没有明确的保证,在实践中你可以期望在比较的两边找到你的操作数,因为操作最终需要观察 ¬(A<B) && ¬(B<A)
来确定 [=11= 之间的相等性] 和 B
.
使您的运算符尽可能抽象,这样就没有关系了。让它只考虑它接收到的两个参数的值,而不考虑任何容器或查找操作。