C++ nullptr、{}和nullopt之间的差异
为什么我不能使用C++ nullptr、{}和nullopt之间的差异,c++,pointers,c++17,stdoptional,C++,Pointers,C++17,Stdoptional,为什么我不能使用nullptr而不是nullopt?为什么{}翻译成nullopt? 可选不是指向T的指针,而是 要么aT要么什么都不是。您不能像指针和引用一样具有“悬空可选”或任何其他类型的“无效”值 nullptr是一个可以转换为任何指针类型的值的对象 nullopt是一个可以转换为任何可选类型的值的对象 {}是(在需要值的上下文中)表示“a”的表达式 类型为T”的默认构造对象,其中T是从上下文推断的某种类型。如果T是指针类型,它将与nullptr进行比较。如果T是可选的类型,它将与null
nullptr
而不是nullopt
?为什么{}
翻译成nullopt
?
不是指向可选
的指针,而是 要么aT
要么什么都不是。您不能像指针和引用一样具有“悬空T
可选
”或任何其他类型的“无效”值
是一个可以转换为任何指针类型的值的对象nullptr
是一个可以转换为任何nullopt
类型的值的对象可选
是(在需要值的上下文中)表示“a”的表达式 类型为{}
”的默认构造对象,其中T
是从上下文推断的某种类型。如果T
是指针类型,它将与T
进行比较。如果nullptr
是T
类型,它将与可选的
进行比较。如果nullopt
是一个算术类型,它将与T
进行比较。如果0
是标准容器类型之一,它将与该类型的其他空容器进行比较T
nullptr
而不是nullopt
因为它们是不同的东西。它们的意思不同,它们被用来做不同的事情
与std::optional
一起使用时,必须有一个独特的nullopt
值,因为nullptr
已经做了一些事情:
std::optional<int*> o;
o = nullptr;
assert( o.has_value() );
o = std::nullopt;
assert( !o.has_value() );
std::可选o;
o=零PTR;
断言(o.has_value());
o=std::nullopt;
断言(!o.has_value());
为什么{}
翻译成nullopt
(注意:这仅适用于std:optional
而不是将{}
与其他类型一起使用时。)
它这样做是因为它可以方便地说
o={}
,并让它做正确的事情™ 因此,编写std::optional
的规范是为了让它工作。您可以使用std::optional
;-)不存在的可选指针与确实存在且为nullptr
的指针不同。默认初始化的可选不应包含对象(对于非默认可构造类型也不能)。我觉得这很明显。另外,我想知道你的问题是否可以通过阅读导致std::optional
被接受的论文来回答<代码>空选项
:“什么都没有”。