如何分配&#34;没有&#34;到std :: optional <t>?

时间:2017-11-22 18:28:19

标签: c++ optional c++17

阅读std::optional,我对于将某些内容 的值分配给{{1}的标准方法感到困惑。 }}

我猜optional是将值赋给可选项的标准机制。似乎工作。这是否意味着底层对象的副本?

分配 nothing 的标准方法是什么?我已经看到operator=(这对我来说没有意义,因为x = {}是一个空块)和{}

2 个答案:

答案 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)

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

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

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

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

  4. 是的,(3)使用optional的移动赋值运算符(默认构造的optional是脱离的,所以这是正确的事情)。这是因为{}std::nullopt_t constructor不匹配,并且在T可从{}构建的情况下,完美前向分配(重载#4)不太受欢迎因为它是一个模板。

    无论T如何,

    (1)和(2)始终有效。 (3)仅在T移动可分配时才有效,因为我们正在通过赋值运算符。但是(3)是最短的。所以YMMV。

    如果(3)对你没有意义,那很好,不要使用它。 Braced-init-lists是该语言中特别奇怪的部分,您可以通过reset()或分配给nullopt来解决问题。