为什么我不能使用nullptr
代替nullopt
?为什么{}
翻译成这样nullopt
?
问问题
2025 次
2 回答
10
为什么我不能使用
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
编写了规范以使其工作。
于 2017-12-13T13:21:12.913 回答
8
optional<T>
不是指向 的指针T
,它是一个要么是 aT
要么什么都不是的值。您不能拥有“悬空optional
”或任何其他类型的“无效”值,就像指针和引用一样。nullptr
是一个可以转换为任何指针类型值的对象。nullopt
是一个可以转换为任何optional
类型值的对象。{}
是(在期望值的上下文中)表示“类型的默认构造对象”的表达式T
,其中T
是从上下文中推断出的某种类型。如果T
是指针类型,它将比较等于nullptr
。如果T
是一个optional
类型,它将比较等于nullopt
。如果T
是算术类型,它将比较等于0
。如果T
是标准容器类型之一,它将与该类型的其他空容器进行比较。
于 2017-12-13T13:02:23.687 回答