Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::optional背后的基本原理是什么?_C++_Std_Optional - Fatal编程技术网

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);
}