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

Can an uninitialised std::optional or boost::optional constructor throw?

是否可以声明以下任一模板方法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)可以抛出吗?

根据 http://en.cppreference.com/w/cpp/experimental/optional/optional.

声明了可选的默认构造函数 noexcept

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

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

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