gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:43 25 4
gpt4 key购买 nike

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

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

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

注意事项:我关心标准是否允许这样做,我知道大多数/所有实现都不会打扰。

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

最佳答案

标准要求,如果您将值存储在 std::optional 中,则该值必须能够完全按照存储的方式检索。此外,如果 optional<T>已订婚,您可以存储任何 Toptional的值(value)而不让 optional知道你在做。像这样:

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

正因为如此,唯一有效的方式optional<T>可以优化以使用 T 的某些值意味着optional未参与是指用户不可能创建 T有了这些值(value)观。 double 的 IEEE-754 实现可以采用任何位模式,并且所有位模式都是合法的(甚至发出 NaN 信号)。

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

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

关于c++ - C++ 标准是否允许在没有开销的情况下实现 std::optional<double>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com