【问题标题】:boost::optional vs boost::make_optionalboost::optional vs boost::make_optional
【发布时间】:2021-04-01 16:12:35
【问题描述】:

我想更好地理解使用 default 构造函数创建 boost::optional 对象之间的区别:

boost::optional<PastaType> pasta = boost::optional<PastaType>(spaghetti)

或使用 make_optional 版本:

boost::optional<PastaType> pasta = boost::make_optional<PastaType>(spaghetti)

环顾四周,我才明白在 make_optional 版本中,PastaType 不能是引用类型,但我想更好地了解何时使用其中一种。

谢谢!

【问题讨论】:

  • 感谢您的回答!我不知道你可以使用 make_optional 而不指定类型。我想到了另外两个相关的问题。使用 make_optional 指定模板参数有什么意义?为什么 spaghetti 必须是 const 类型?
  • 如果您指定模板参数,使用make_optional 没有多大意义。我认为您对const 有误。它根据表达式的值类别复制或移动它的参数
  • “我想到了另外两个相关的问题。” cmets 部分不是提出新问题的好地方。考虑将其中一个答案标记为正确(似乎您接受它们)并提出问题in the usual way
  • 1) 我想不出任何理由,除非否则扣除会失败。如果您使用 C++17 或更高版本,您可能可以跳过 make_optional。 2) “必须是const”是什么意思?
  • 谢谢大家!很抱歉对评论会话的使用不当;我认为将所有内容放在一起会对未来的读者有所帮助。无论如何,我对 const 的假设是错误的;我在this新问题中更好地解释了我的疑问

标签: c++ boost boost-optional


【解决方案1】:

make_optional 是一个方便或辅助函数,可以通过推断optional 的模板参数来减少您必须编写的代码量。这两种方法在功能上是等价的。

auto pasta = boost::make_optional(spaghetti);

【讨论】:

    【解决方案2】:

    在 C++17 之前,您无法从类的初始化中推断出类的模板参数,就像使用函数模板调用一样。

    作为一种变通方法,以make_thing 形式命名并构造thing 的函数允许推导。

    auto pasta = boost::make_optional(spaghetti); // pasta is boost::optional<PastaType>
    
    auto pasta = boost::optional(spaghetti); // compile error before C++17, afterward pasta is boost::optional<PastaType>
    

    【讨论】:

    • make_thing 对于thing&lt;thing&lt;T&gt;&gt; 仍然有用,因为thing{some_thing} 使用复制构造函数,而make_thing(some_thing); 真正返回thing&lt;thing&lt;..&gt;&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多