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
对我来说,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