【发布时间】:2021-07-23 00:48:03
【问题描述】:
能够比较std::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 中添加了这个的原因是什么?
【问题讨论】:
-
@JDługosz 正如我所说,我希望它甚至无法编译
-
这样你就可以拥有一个
std::optional的容器,并对其进行排序。或者在需要订购时使用std::optional。 -
@JDługosz 确切地说,我认为使
nullopt总是小于任何其他值是完全任意的。由于许多这些不明显的默认行为通常不会进入标准,我想知道为什么这个特定的行为可以代替。 -
我不明白是什么让
opt_value == value(对于支持operator==的值类型比opt_value < value(对于支持operator<的值类型)在语义上更有意义),可能的例外是感觉比nullopt_t != value更“明显”,而 null 可选值和实际值的顺序并不是那么直观。但是“空可选值小于所有值”在 imo 中并不奇怪。 -
@nyarlathotep108:“是一种非常隐晦的晦涩行为。”我不同意。如果要比较未参与的
optional<T>,则只有两个答案:小于所有Ts,或大于所有Ts。
标签: c++ c++17 stdoptional