代码之家  ›  专栏  ›  技术社区  ›  user8370684

如何将“nothing”分配给std::可选?

  •  19
  • user8370684  · 技术社区  · 7 年前

    阅读关于 std::optional ,我对赋值的标准方法感到困惑 某物 没有什么 optional .

    我猜 operator= 将是为可选项赋值的标准机制。似乎有效。这是否意味着底层对象的副本?

    分配的标准方法是什么 没有什么 ? 我看到了 x = {} (这对我来说毫无意义 {} x = std::nullopt .

    2 回复  |  直到 7 年前
        1
  •  19
  •   AndyG    7 年前

    我不会说有一种“标准”方法可以不为std::optional分配任何内容。

    如果你阅读 the proposal 对于 std::optional (“添加实用程序类以表示可选对象的建议”)作者按以下顺序提出了两种方法:

    我们在standardese中加入了额外的要求,以确保以下语法可用于重置可选的:

    op = {};
    

    我们认为这将成为C语言中重置(放入默认构造状态)值的常见习惯用法++

    请注意,这不是分离可选对象的唯一方法。您还可以使用:

    op = std::nullopt;
    

    std::optional::reset 在撰写该提案时不存在,因此未提及,但这也是一种有效的方式。

        2
  •  13
  •   Barry    7 年前

    这是一个选择你自己的冒险。您有三种选择:

    1. my_opt.reset() . 只需直接将可选设置为脱离状态。

    2. my_opt = std::nullopt; 这使用 operator=() 过载#1

    3. my_opt = {}; 这使用 运算符=() 过载#3。

    是,(3)使用 optional 的移动赋值运算符(默认构造 可选择的 是分离的,所以这样做是正确的)。这是因为 {} 将不匹配 std::nullopt_t constructor ,并且在以下情况下,理想的正向分配(重载#4)将不太可取: T 可以从 {} 因为这是一个模板。

    (1) 和(2)始终工作,无论 T . (3) 仅在以下情况下有效 T

    如果(3)对你来说没有意义,那很好,不要使用它。带括号的init列表是该语言中一个特别奇怪的部分,您不会出错 reset() 或分配给 nullopt .