【问题标题】: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:“什么都没有”。

标签: c++ pointers c++17 stdoptional


【解决方案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 是标准容器类型之一,它将与该容器的其他空容器比较输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2013-08-07
      • 2011-10-20
      相关资源
      最近更新 更多