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

时间:2018-10-22 11:18:15

标签: c++ floating-point c++17 ieee-754 stdoptional

我刚刚看过cppcon谈论彭博数据,这是一种使用IEEE754格式的冗余来编码存储在数据中的类型的变量类型。

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

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

注释: 我在乎标准是否允许这样做,我知道大多数/所有实现都不会打扰。

我知道IEEE754不是该标准的强制性要求,但可以通过实现对其进行允许和检查。

1 个答案:

答案 0 :(得分:4)

该标准要求,如果将值存储在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.

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

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

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