阅读有关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 次 |
最近记录: |