3

能够比较 astd::optional<T>与的相等性是非常有用的T

std::optional<int> opt_value;
int value = 123;

opt_value == value; // will always be 'false'

我认为这种情况下的行为定义明确且清晰。

我不明白为什么允许这样做:

opt_value < value; // this will always be 'true'

我期待这甚至无法编译。我认为这里发生的事情非常模糊。甚至将其添加到STL的原因是什么?

4

3 回答 3

3

简短回答: map<optional<int>, int>
您希望在optional<T>可用作map钥匙时T能够用作钥匙。将空状态定义为小于或大于正常值使其表现良好。

同时,从逻辑上讲,将纯数据T与纯数据进行比较只是将裸数据升级为持有该值。因此,提供一个采用裸露的重载形式只是一种优化,并且应该具有相同的结果。optional<T>Toptional<T>T

于 2021-04-29T16:09:52.860 回答
3

介绍给 C++ 的提案optional陈述了 type 的概念。Anoptional<T>是一个对象,它T使用附加值扩充对象类型:nullopt。这就是类型的想法;它T可以有一个额外的价值。

鉴于此推理,如果T是有序的,那么optional<T>也应该是有序的。所以现在的问题不是是否应该实现这一点,而是如何做到这一点。

该答案将是任意的,但只有两个合理的答案:“非 a T”小于 的所有值T或大于 的所有值T。他们选择了前者。

于 2021-04-29T16:18:30.617 回答
0

从本质上讲,它允许您更轻松地比较值。有了这个,你不必写:

opt_value.value() < value;

它还检查以确保opt_value具有值。

于 2021-04-29T16:17:23.680 回答