可以使用未初始化的std :: optional或boost :: optional构造函数吗?

时间:2016-01-14 20:55:51

标签: c++ optional noexcept boost-optional

可以将以下任一模板方法声明为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::optionalnullopt/none)可以投掷吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你正在从T值(可能是optional<T>)构造一个T&&,然后调用T的相应ctor。如果T的ctor抛出,那么可选的ctor也是如此。根据{{​​1}}块中缺少的代码,您的异常规范应该类似于

try{}

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