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

Does C++ standard allow std::optional<double> to be implemented without overhead

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

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

请注意,这有时需要存储在可选中的双精度二进制表示与传递给构造函数的双精度二进制表示不匹配。

备注: 我关心标准是否允许这样做,我知道 most/all 实现不会打扰。

我知道 IEEE754 不是标准强制要求的,但它是允许的并且可以通过实施检查。

标准要求,如果您将值存储在 std::optional 中,则该值必须能够完全按照存储的方式检索。此外,如果 optional<T> 被占用,您可以将 any T 存储在 optional 的值中而不让 optional 知道你在做像这样:

optional<T> opt = T{};
auto &&val = *opt;
val = <insert value here>; //opt has no idea it has been set.

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

其他可选类型可以这样做的原因是因为它们与用户有一个隐含的协议,即他们不会将其设置为某些值。 std::optional<T> 没有这样的协议; T 可以假定的任何值都可以存储和检索。

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