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