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

  • 可选
    不是指向
    T
    的指针,而是 要么a
    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
被接受的论文来回答<代码>空选项
:“什么都没有”。