【发布时间】:2019-03-26 10:54:01
【问题描述】:
我刚刚看了 cppcon 谈论 Bloomberg datum,变体类型使用 IEEE754 格式的冗余来编码存储在 datum 中的类型。
所以我想知道 C++ 标准是否允许实现通过使用相同的技巧更有效地实现 std::optional。
请注意,这需要有时存储在 optional 中的 double 的二进制表示与传递给构造函数的 double 的二进制表示不匹配。
注意事项: 我关心标准是否允许这样做,我知道大多数/所有实现都不会打扰。
我知道 IEEE754 不是标准强制要求的,但它是允许的并且可以通过实施检查。
【问题讨论】:
-
如果没有标准的明确禁止,那怎么可能不允许呢?请注意,UB 不适用于实现,就像它适用于用户代码一样。
-
“我知道大多数/所有实现都不会打扰” - 为什么会有负面影响?
-
@StoryTeller STL 是一个庞大的库,而 std::optional
极少使用……而且大多数 STL 实现只有少数全职开发人员在工作。 -
@BaummitAugen 就像我说的那样,它破坏了值的二进制表示。也可能有其他我没有想到的问题,这就是我问的原因。
-
我没看过那个演讲,但是在 IEEE-754 下,浮点值中的 每个 位模式都是有意义的。 Many 值很少使用;信令 NaN 在日常编程中大多无用。但是通用库不能忽略它们的存在并使用它们来编码“非值”;这会破坏使用它们的(诚然很少见的)代码。
标签: c++ floating-point c++17 ieee-754 stdoptional