为什么我不能使用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 回答