阅读std::optional
,我对于将某些内容和 的值分配给{{1}的标准方法感到困惑。 }}
我猜optional
是将值赋给可选项的标准机制。似乎工作。这是否意味着底层对象的副本?
分配 nothing 的标准方法是什么?我已经看到operator=
(这对我来说没有意义,因为x = {}
是一个空块)和{}
。
答案 0 :(得分:8)
我不会说有一种“标准”方式可以为std :: optional分配任何内容。
如果您阅读std::optional
op = {};
(“添加实用程序类以表示可选对象的提议”),作者将按以下顺序提供两种方式:
我们在标准中添加了额外的要求,以确保以下语法可用于重置可选项:
op = std::nullopt;
我们认为这将成为在C ++中重置(置于默认构造状态)值的常用习惯用法
请注意,它不是脱离可选对象的唯一方法。您也可以使用:
std::optional::reset
在撰写该提案时, <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="carousel slide media-carousel display-mobile-on" id="media2">
<div class="carousel-inner mobile-margin-top-50 ">
<div class="item active">
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12 padding-none">
<div class="team">
<img class="team-img" src="/images/avatar-default.png" alt="">
<div class="row margin-bottom-10">
<div class="col-md-12 text-center">
<div class="team-h">Ross Adams</div>
<div class="team-h2">CEO</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<a href="#" target="_blank"><img width="85px" src="images/linkedin.png" alt=""></a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="item">
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12 padding-none">
<div class="team">
<img class="team-img" src="/images/avatar-default.png" alt="">
<div class="row margin-bottom-10">
<div class="col-md-12 text-center">
<div class="team-h">Ross Adams</div>
<div class="team-h2">CEO</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<a href="#" target="_blank"><img width="85px" src="images/linkedin.png" alt=""></a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="item">
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12 padding-none">
<div class="team">
<img class="team-img" src="/images/avatar-default.png" alt="">
<div class="row margin-bottom-10">
<div class="col-md-12 text-center">
<div class="team-h">Ross Adams</div>
<div class="team-h2">CEO</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<a href="#" target="_blank"><img width="85px" src="images/linkedin.png" alt=""></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<a id="mobile-prev1" data-slide="prev" href="#media2" class="left carousel-control">‹</a>
<a id="mobile-next1" data-slide="next" href="#media2" class="right carousel-control">›</a>
</div>
并不存在,因此没有提及,但它也是一种有效的方法。
答案 1 :(得分:6)
这是一个选择你自己的冒险。您有三种选择:
my_opt.reset()
。只需将可选项直接设置为脱离状态即可。
my_opt = std::nullopt;
这使用operator=()
重载#1
my_opt = {};
这会使用operator=()
重载#3。
是的,(3)使用optional
的移动赋值运算符(默认构造的optional
是脱离的,所以这是正确的事情)。这是因为{}
与std::nullopt_t
constructor不匹配,并且在T
可从{}
构建的情况下,完美前向分配(重载#4)不太受欢迎因为它是一个模板。
T
如何,(1)和(2)始终有效。 (3)仅在T
移动可分配时才有效,因为我们正在通过赋值运算符。但是(3)是最短的。所以YMMV。
如果(3)对你没有意义,那很好,不要使用它。 Braced-init-lists是该语言中特别奇怪的部分,您可以通过reset()
或分配给nullopt
来解决问题。