C++ std::optional背后的基本原理是什么?
对我来说,C++ std::optional背后的基本原理是什么?,c++,std,optional,C++,Std,Optional,对我来说,std::optional始终是std::unique_ptr的“更干净”版本:两者都有一个空状态(optional()和nullptr),否则就拥有一个T对象。然而,当考虑std::optional时,这种类比就不成立了。第一个代码块有效,而第二个代码块不应有效,因为类型(const T)需要可移动分配 std::unique_ptr<const int> ptr1, ptr2; ptr1 = std::move(ptr2); std::optional<cons
std::optional
始终是std::unique_ptr
的“更干净”版本:两者都有一个空状态(optional()
和nullptr
),否则就拥有一个T
对象。然而,当考虑std::optional
时,这种类比就不成立了。第一个代码块有效,而第二个代码块不应有效,因为类型(const T
)需要可移动分配
std::unique_ptr<const int> ptr1, ptr2;
ptr1 = std::move(ptr2);
std::optional<const int> opt1, opt2;
opt1 = std::move(opt2);
所以我想知道,让
成为可选的方式背后的思维过程是什么?因为我觉得很奇怪。是否有一些我正在监督的缺陷? < P>就像C++标准库中的所有内容C++ 11,<代码> STD::可选< /COD>直接从<代码> Boost 库组中解开。
动机被阐明了为什么你要将std::optional
与std::unique\u ptr
进行比较,因为它们是不同的野兽?可以通过阅读std::optional
的祖先找到基本原理。他们在精神上非常接近,尽管标准类型有一些小的变化。@EdHeal我想我已经把我的比较弄清楚了;你不明白哪一部分?当然,它们是不同的,但我总觉得它们是可选的,就像现代版的“将空值作为空对象传递”范例。@StoryTeller谢谢,我会看看这是否为我澄清了问题。一个与指针有关,另一个与指针无关
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);
}