C++标准是否允许在没有开销的情况下实现std :: optional <double>

NoS*_*tAl 5 c++ floating-point ieee-754 c++17 stdoptional

我刚刚看了cppcon谈论Bloomberg数据,这种变体类型使用IEEE754格式的冗余来编码存储在数据中的类型.

所以我想知道C++标准是否允许实现通过使用相同的技巧更有效地实现std :: optional.

请注意,这将要求有时存储在optional中的double的二进制表示与传递给构造函数的double的二进制表示不匹配.

注意:我关心标准允许这个与否,我知道大多数/所有实现都不会打扰.

我知道IEEE754不是标准规定的,但它是允许的,并且可以通过实现来检查.

Nic*_*las 5

该标准要求,如果您将值存储在中std::optional,则必须能够完全按照存储的值来检索该值。此外,如果使用,则optional<T>可以将任何 值存储T为,optional而无需optional知道您正在执行此操作。像这样:

optional<T> opt = T{};
auto &&val = *opt;
val = <insert value here>; //opt has no idea it has been set.
Run Code Online (Sandbox Code Playgroud)

因此,optional<T>可以优化唯一有效的方法,以使用某些值T表示optional未参与,如果用户无法T用这些值创建一个。的IEEE-754实现double可以采用任何位模式,并且所有这些模式都是合法的(甚至是信号NaN)。

其他可选类型可以执行此操作的原因是,由于它们与用户达成隐式协议,即不会将其设置为某些值。std::optional<T>没有这样的协议;任何T可以假定的值都可以存储和检索。

现在,如果optional<T>::operator*并且optional<T>::value返回了某种代理对象而不是直接引用T,则这是可能的,因为代理可以处理适当的转换。但是即使那样,该标准也必须明确指出,尝试将其设置为这些值之一将导致该值采用等效但不同的对象表示形式。

  • Nitpick:也许您可以对答案做一个大的介绍,因为很多人可能无法遵循答案,因为它需要一些非凡的C ++知识,例如auto &amp;&amp; (2认同)
  • @NoSenseEtAl:人们需要[越来越熟悉](/sf/ask/3602289701/)来实现“ auto &amp;&amp;”,所以越早越好。同样,在功能上,如果使用optional &lt;T&gt;,则它与auto相同。 (2认同)