阅读有关std::optional,我感到困惑的是分配的价值标准方式的东西,并没有到optional.
我想operator=这将是为可选项赋值的标准机制.似乎工作.这是否意味着底层对象的副本?
什么是没有分配的标准方法?我见过x = {}(这对我来说没有意义,因为它{}是一个空块)和x = std::nullopt.
我不会说有一种"标准"的方式来为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 在撰写该提案时并不存在,因此没有提及,但它也是一种有效的方法.
这是一个选择你自己的冒险.你有三个选择:
my_opt.reset().只需将可选项直接设置为脱离状态即可.
my_opt = std::nullopt;这使用了operator=()重载#1
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.
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |