Может ли неинициализированный конструктор 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)