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

时间:2017-01-01 12:32:44

标签: c++ std optional

对我而言,std::optional<T>始终是一个更清洁的&#34;版本std::unique_ptr<T>:两者都有空状态(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背后的思考过程是什么?因为这对我来说似乎很奇怪。我在监督是否有一些陷阱?

1 个答案:

答案 0 :(得分:1)

与c ++ 11之后的c ++标准库中的所有内容一样,std::optional直接从boost库套件中解除。

动机布局here