【问题标题】:Can an uninitialised std::optional or boost::optional constructor throw?未初始化的 std::optional 或 boost::optional 构造函数可以抛出吗?
【发布时间】:2016-04-20 08:48:33
【问题描述】:

以下模板方法可以声明noexcept吗?

template <typename T>
std::optional<T> foo(const T& value) // noexcept?
{
    try {
        // code possibly returning a T or a std::nullopt
    } catch(...) {
        return std::nullopt;
    }
}

template <typename T>
boost::optional<T> bar(const T& value) // noexcept?
{
    try {
        // code possibly returning a T or a boost::none
    } catch(...) {
        return boost::none;
    }
}

换句话说,未初始化的std/boost::optional (nullopt/none) 可以抛出吗?

【问题讨论】:

  • 不确定我是否遵循了这个问题。如果您尝试通过 value() 提取它的值,则会抛出未初始化的可选项。
  • 当然可以,但是可以构造未初始化的可选 throw(即问题中的函数可以声明为noexcept)吗?
  • optional 的默认构造函数是noexcept。这是你的问题吗?
  • 是的...这样说会更好!你有参考资料吗?
  • 带有一个不会重新抛出的try-catch 块,无论如何你都可以声明函数noexcept,对吧? stackoverflow.com/a/28975065/27678

标签: c++ optional noexcept boost-optional


【解决方案1】:

可选的默认构造函数声明为noexcept,根据http://en.cppreference.com/w/cpp/experimental/optional/optional

【讨论】:

    【解决方案2】:

    您正在从 T 的值(可能是 T&amp;&amp;)构造一个 optional&lt;T&gt;,它又调用 T 的相应 ctor。如果 T 的 ctor 抛出,那么 optional 的 ctor 也会抛出。根据try{} 块中缺少的代码的作用,您的异常规范应该类似于

    noexcept(std::is_nothrow_move_constructible<T>::value)
    

    noexcept(std::is_nothrow_constructible<T>::value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2017-05-14
      • 2019-10-11
      • 2018-09-20
      • 2012-02-16
      相关资源
      最近更新 更多