【问题标题】:Can I return an optional from a constexpr function?我可以从 constexpr 函数返回一个可选项吗?
【发布时间】:2013-05-07 13:10:47
【问题描述】:
  • 我可以从constexpr 函数返回optional 吗?
  • 为什么?
  • 如果是,它是如何工作的?

我对@9​​87654324@ 和std::optional 都感兴趣。它们的行为是否相同?

【问题讨论】:

  • std::optional 肯定是forgot about the c++1y tag
  • @sehe 感谢您的编辑!允许这样做的std::optionalboost::optional 之间有什么区别?对于 c++11,boost::optional 有可能吗?

标签: c++ boost std constexpr boost-optional


【解决方案1】:

boost::optional 不能由 constexpr 函数返回。或者至少,文档没有提供任何保证

但是,std::optional,如已接受的 C++14 提案所定义,可以constexpr 函数返回。但optional 的类型参数可轻易破坏的情况下。

这使得std::optional 的析构函数在这些情况下变得微不足道。此时,销毁对象没有任何困难,因此没有什么可以阻止 std::optional 成为文字类型。

The proposal is quite clear on this. 如果T 可以简单地破坏,那么optional 的大部分构造函数将是constexpr,而optional<T> 将是一个文字类型。因此,它可以在constexpr 函数中创建。

【讨论】:

    【解决方案2】:

    Boost.Optional 不支持constexpr,主要是因为它是在 C++11 发布之前编写的。

    current proposal for std::optional 确实支持constexpr,只要值类型T 可以简单地破坏。 works because constexpr 构造函数被允许用于联合(7.1.5p4);编译器跟踪初始化了哪个联合成员,确保在编译时捕获未定义的访问未使用的可选值的行为:

    struct dummy_t {};
    template <class T>
    union optional_storage {
      static_assert( is_trivially_destructible<T>::value, "" );
      dummy_t dummy_;
      T       value_;
      constexpr optional_storage(): dummy_{} {}  // disengaged
      constexpr optional_storage(T const& v): value_{v} {}  // engaged
      ~optional_storage() = default;
    };
    

    值类型必须是可平凡破坏的,因为constexpr 仅对文字类型有用,文字类型本身必须具有平凡的析构函数。

    例如写作:

    constexpr optional_storage<int> o{};
    constexpr int i = o.value_;
    

    gcc 给出错误:

    error: accessing ‘optional_storage<int>::value_’ member instead of initialized 
    ‘optional_storage<int>::dummy_’ member in constant expression
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多