对我而言,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
背后的思考过程是什么?因为这对我来说似乎很奇怪。我在监督是否有一些陷阱?