为什么 std::Optional 不使用哨兵值来表示空可选?

NoS*_*tAl 5 c++ language-design stdoptional

我知道这艘船由于需要 ABI 损坏而已经航行,但我想知道为什么最初的实现没有决定使用一些神奇的位模式std::stringstd::vector表示空的可选值。这显然需要类型的位表示中的一些“自由”值,因此例如它不适用于intsize_t但许多复杂类型具有某些永远不会出现在有效实例中的表示。

C++ 甚至可以指定某种方式来选择您的类型,例如通过专门化

std::nullopt_sentinel
Run Code Online (Sandbox Code Playgroud)

对于用户定义的类型。

我最好的猜测是,指定/实现这个的复杂性(因为您需要为许多类型实现哨兵std::)比总是使用 bool 要大得多,但我想知道是否还有其他原因。

Rust 的类似答案似乎有时会实现这一点

/sf/answers/1156084191/

use*_*522 4

标准库和任何专门针对std::optional自己类型的用户已经可以在可能的情况下自由地以这种方式实现类型(请参阅[namespace.std] p2)。

规范中没有任何内容std::optional强制要求使用标志bool来指示值的存在。如何识别空状态是一个实现细节。std::optional如果可选项为空,则用户不能依赖于观察有关内部状态的任何其他内容。