std::optional背后的原理是什么?

What is the rationale behind std::optional?

对我来说,std::optional<T> 一直是 std::unique_ptr<T> 的 "cleaner" 版本:两者都有一个空状态(optional()nullptr)并且拥有一个T 否则反对。然而,当考虑 std::optional<const T> 时,这个类比就失效了。第一个代码块有效,而第二个代码块不应该有效,因为类型 (const T) 需要是 MoveAssignable。

std::unique_ptr<const int> ptr1, ptr2;
ptr1 = std::move(ptr2);

std::optional<const int> opt1, opt2;
opt1 = std::move(opt2);

基于类似的推理,我希望 std::optional<T&> 等同于非拥有指针 T*。虽然这个类比对于一般的 T 来说有点模糊,但我认为它对 const T.

很有意义
const int ZERO = 0;

void AssignPtrIfNull(const int*& ptr) {
  ptr = (ptr == nullptr ? &ZERO : ptr);
}

void AssignOptIfNull(std::optional<const int&>& ptr) {
  ptr = (ptr ? make_optional<const int&>(ZERO) : ptr);
}

所以我想知道,optional 背后的思考过程是什么?因为这对我来说真的很奇怪。有没有我监督的陷阱?

与 c++ 标准库 post c++11 中的所有内容一样,std::optional 直接从 boost 库套件中提取出来。

动机已经摆好here