如何为std :: optional <T>分配"nothing"?

8 c++ optional c++17

阅读有关std::optional,我感到困惑的是分配的价值标准方式的东西,并没有optional.

我想operator=这将是为可选项赋值的标准机制.似乎工作.这是否意味着底层对象的副本?

什么是没有分配的标准方法?我见过x = {}(这对我来说没有意义,因为它{}是一个空块)和x = std::nullopt.

And*_*dyG 8

我不会说有一种"标准"的方式来为std :: optional分配任何内容.

如果你读的建议std::optional("A建议增加一个工具类来表示可选对象")的作者提出两种方法,顺序如下:

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

op = {};
Run Code Online (Sandbox Code Playgroud)

我们认为这将成为在C++中重置(置于默认构造状态)值的常用习惯用法

请注意,它不是脱离可选对象的唯一方法.您还可以使用:

op = std::nullopt;
Run Code Online (Sandbox Code Playgroud)

std::optional::reset 在撰写该提案时并不存在,因此没有提及,但它也是一种有效的方法.


Bar*_*rry 6

这是一个选择你自己的冒险.你有三个选择:

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

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

  3. my_opt = {};这使用了operator=()#3重载.

是的,(3)使用了optional移动赋值运算符(默认构造optional是脱离的,所以这是正确的).这是因为{}std::nullopt_t构造函数不匹配,并且完全向前赋值(重载#4)在T可构造的情况下不太优选,{}因为它是模板.

无论如何,(1)和(2)总是有效T.(3)只有T移动可分配才有效,因为我们正在通过赋值运算符.但是(3)是最短的.所以YMMV.

如果(3)对你没有意义,那很好,不要使用它.Braced-init-lists是语言的一个特别奇怪的部分,你不能错过reset()或分配nullopt.