C++ 为什么null std::optional被认为比任何值都小,而不是更多

C++ 为什么null std::optional被认为比任何值都小,而不是更多,c++,C++,让null std::optional小于任何保留值有什么数学意义吗?或者它只是为了一致性,如果它是“更多”而不是“更少”,那就没有任何区别了?直接来自(强调我的): 已经提出了在比较中包括脱离状态的一些方法所提议的那些,经过精心设计,使得等价公理和严格弱序公理得以保留:分离的可选被简单地视为仅与自身相等的T的附加唯一值;此值总是比T的任何值都小 进一步说 值nullopt也可以被认为大于T的任何值。这个选择在很大程度上是任意的。我们选择坚持boost::optional的做法 看看boost

让null std::optional小于任何保留值有什么数学意义吗?或者它只是为了一致性,如果它是“更多”而不是“更少”,那就没有任何区别了?

直接来自(强调我的):

已经提出了在比较中包括脱离状态的一些方法所提议的那些,经过精心设计,使得等价公理和严格弱序公理得以保留:分离的
可选
被简单地视为仅与自身相等的
T
的附加唯一值;此值总是比
T
的任何值都小

进一步说

nullopt
也可以被认为大于
T
的任何值。这个选择在很大程度上是任意的。我们选择坚持
boost::optional
的做法


看看boost::optional(可选),我们从以下几个方面了解到:

以类似的方式,只要
T
lessthanparable
,类型
optional
就是
lessthanparable
。不包含值的可选对象的比较小于
T
的任何值。为了说明这一点,如果
size\u t
的默认顺序是
{0,1,2,…}
,那么
可选的
的默认顺序是
{boost::none,0,1,2,…}
。这一命令没有实际的解释。目标是拥有任何语义正确的默认顺序,以便
optional
在有序关联容器中可用(只要
T
可用)


所以不,除了“没有什么比什么都少”之外,这一切都没有“数学意义”。这是一个任意的选择,没有实际的后果,只是为了确保该类型可以在订购的容器中使用而没有太多麻烦。

我认为这是任意的,尽管你总是可以在事后找到原因。说它与你在BooL中得到的顺序一致。如果它没有任何后果,C++库中的默认比较是< > > @罗伯特安德雷泽,我不同意。例如,我的默认设置是编译错误。你怎么能把你没有的东西和你拥有的东西相比较呢?为什么要少一点呢?如果该值类型不能为负值,而现在由于这种隐式行为,我允许代码的值小于0,该怎么办?@nyarlathotep108我不明白你的意思。如果您的值类型不能为负值,则应在类型定义中,而不是在
可选项中。
可选
要么有值,要么没有值。如果你不想将“无”与某物进行比较,那么就不要对其进行编程。但是如果您这样做了,那么这就是默认行为-您可以自定义它。例如,删除特定可选类型的专门化。我的意思是,突然自动引入小于0的值可能会非常奇怪,因为我想要一些值来覆盖它可能不存在的可能性。在我看来,
nullopt
是一种未定义的状态,无法与已定义的状态进行比较。它要么是你没有的,要么是你一无所知的。我通常将其视为编译时可检查的未初始化值。我不喜欢默认情况下将其作为可比值进行威胁。只有像==和!=这样的运算符应该被定义。它有实际的后果。例如,我有一个函数返回一个值,我认为该值有时可能不存在。我将函数更改为返回
可选
。在我的测试中,我使用了
auto result=f()
,并将返回值与某个阈值进行比较。当被测函数返回
nullopt
@nyarlathotep108时,它不仅可以编译,而且我的测试也不会被破坏。如果它返回
可选的
,那么你不应该首先检查它是否有值吗?@RobertAndrzejuk当然应该,我想说的是,在这种情况下,编译器不会强制我重构测试,因为
操作符>
在默认情况下是自动可用的,它的行为可能不一定是我想要或期望的。