【问题标题】:Initialize boost::optional with ternary operator使用三元运算符初始化 boost::optional
【发布时间】:2021-07-03 13:18:03
【问题描述】:

是一种初始化可选的方式,比如:

bool conditional = true;
boost::optional<int> opt = conditional ? 5 : boost::none;

为什么会出现错误?:

main.cpp:31:31: error: operands to ?: have different types ‘int’ and ‘const boost::none_t’
boost::make_optional(cond ? 5 : boost::none);
      |                          ~~~~~^~~~~~~~~~~~~~~~~

通过简单的if else 我可以做到这一点:

boost::optional<int> opt;
if (cond)
    opt = 5;
else
    opt = boost::none;

【问题讨论】:

    标签: c++ c++11 boost optional


    【解决方案1】:

    三元运算符要求左右为相同(或可转换)类型。 none_tint 不是同一类型。你可以做cond ? boost::optional&lt;int&gt;(5) : boost:none

    我不使用 boost,所以只是根据std::optional 猜测语法,但以下方法确实有效:

    std::optional<int> opt = cond ? std::optional<int>(5) : std::nullopt;
    

    【讨论】:

      【解决方案2】:

      ?a:b 要求 ab 具有要转换为 C++ 可以推断的通用类型。

      boost::none5 没有这个。

      auto opt = conditional ? boost::optional<int>(5) : boost::none;
      

      有效

      auto opt = conditional ? 5 : boost::optional<int>();
      

      也可以。

      你也可以写一个助手

      auto opt = maybe_optional( conditional, 5 );
      

      在哪里

      template<class T>
      boost::optional<T> maybe_optional( bool b, T t ) {
        if (b) return std::forward<T>(t);
        return boost::none;
      }
      

      【讨论】:

        【解决方案3】:

        三元运算符的结果需要是单一类型。 : 的左右参数,因此需要是相同的类型,或者可以转换为相同的类型。

        【讨论】:

          猜你喜欢
          • 2010-12-20
          • 2013-07-27
          • 2023-01-02
          • 2012-07-14
          • 2013-03-30
          • 2015-07-11
          • 2016-07-27
          • 1970-01-01
          • 2018-07-02
          相关资源
          最近更新 更多