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<T>
不是指向T
的指针,它是一个值
要么是T
,要么什么都不是。您不能拥有“悬空optional
”或任何其他类型的“无效”值,就像指针和引用一样。
nullptr
是一个可以转换为任何指针类型值的对象。
nullopt
是一个可以转换为任何optional
类型的值的对象。
是(在期望值的上下文中)表示“a
T
" 类型的默认构造对象,其中T
是从上下文推断的某种类型。如果T
是指针类型,它将比较等于nullptr
。如果T
是optional
类型, 它将比较等于nullopt
。如果T
是算术类型,它将比较等于0
。如果T
是标准容器类型之一,它将与该容器的其他空容器比较输入。
【讨论】:
以上是关于nullptr、 和 nullopt 的区别的主要内容,如果未能解决你的问题,请参考以下文章
std::optional - 用 或 std::nullopt 构造空?