nullptr、 和 nullopt 的区别

Posted

技术标签:

【中文标题】nullptr、 和 nullopt 的区别【英文标题】:Difference between nullptr, and nulloptnullptr、 和 nullopt 的区别 【发布时间】:2018-05-27 06:24:27 【问题描述】:

为什么我不能使用nullptr 而不是nullopt?为什么 会翻译成nullopt

【问题讨论】:

你可以有std::optional<std::nullptr_t> ;-) 一个不存在的可选指针不同于一个确实存在的指针nullptr。默认初始化的 optional 不应该有对象(并且不能用于非默认可构造类型)。这对我来说似乎很明显。另外,我想知道您的问题是否可以通过阅读导致std::optional被接受的论文来回答。 nullptr = "有一个指针但它没有指向任何东西"; nullopt:“什么都没有”。 【参考方案1】:

为什么我不能使用nullptr 而不是nullopt

因为它们是不同的东西。它们意味着不同的东西,它们被用于不同的东西。

必须有一个独特的nullopt 值才能与std::optional 一起使用,因为nullptr 已经做了一些事情:

std::optional<int*> o;
o = nullptr;
assert( o.has_value() );
o = std::nullopt;
assert( !o.has_value() );

为什么 会翻译成nullopt

(注意,这仅适用于 std:optional,不适用于将 与其他类型一起使用时。)

之所以这样做,是因为能够说 o = 并让它 Do The Right Thing™ 很方便,因此编写了 std::optional 的规范以使其工作。

【讨论】:

【参考方案2】:

optional&lt;T&gt; 不是指向T 的指针,它是一个值 要么是T,要么什么都不是。您不能拥有“悬空optional”或任何其他类型的“无效”值,就像指针和引用一样。

nullptr 是一个可以转换为任何指针类型值的对象。

nullopt 是一个可以转换为任何optional 类型的值的对象。

是(在期望值的上下文中)表示“a T" 类型的默认构造对象,其中T 是从上下文推断的某种类型。如果T 是指针类型,它将比较等于nullptr。如果Toptional 类型, 它将比较等于nullopt。如果T 是算术类型,它将比较等于0。如果T 是标准容器类型之一,它将与该容器的其他空容器比较输入。

【讨论】:

以上是关于nullptr、 和 nullopt 的区别的主要内容,如果未能解决你的问题,请参考以下文章

C++的nullptr与NUL

C/C++杂记:NULL与0的区别nullptr的来历

std::optional - 用 或 std::nullopt 构造空?

[转]为什么要引入nullptr?

C++11新特性nullptr与std::nullptr_t

7,NULL与nullptr对比