3

为什么我不能使用nullptr代替nullopt?为什么{}翻译成这样nullopt

4

2 回答 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 回答