Может ли неинициализированный конструктор std::option или boost::option генерировать?

Может ли быть объявлен любой из следующих методов шаблона 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) бросить?

2 ответа

Решение

По умолчанию конструктор по желанию объявлен noexceptв соответствии с http://en.cppreference.com/w/cpp/experimental/optional/optional.

Вы создаете optional<T> от значения T (вероятно, T&&), который, в свою очередь, вызывает соответствующий ctor объекта T. Если ctor бросает t, то и ctor необязательный. В зависимости от того, что отсутствует код внутри try{} блок делает, ваша спецификация исключения должна быть что-то вроде

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

или же

noexcept(std::is_nothrow_constructible<T>::value)
Другие вопросы по тегам