0

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

4

2 回答 2

1

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

于 2016-01-14T21:11:15.353 回答
0

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

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

或者

noexcept(std::is_nothrow_constructible<T>::value)
于 2016-01-14T21:41:54.200 回答