该标准要求,如果您将值存储在 中std::optional
,则该值必须能够完全按照存储的方式检索。此外,如果 an被使用,您可以在' 值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
未参与,如果用户不可能使用这些值创建 a T
。的 IEEE-754 实现double
可以采用任何位模式,并且它们都是合法的(甚至是信号 NaN)。
其他可选类型可以这样做的原因是因为它们与用户有一个隐含的协议,即它们不会将其设置为某些值。std::optional<T>
没有这样的协议;T
可以存储和检索任何可以假定的值。
现在,如果optional<T>::operator*
并且optional<T>::value
返回某种代理对象而不是对 的直接引用T
,那么这可能是可能的,因为代理可以处理适当的转换。但即便如此,该标准也必须明确指出,尝试将其设置为这些值之一将导致该值采用等效但不同的对象表示。