未初始化的 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::optional
(nullopt/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)
是否可以声明以下任一模板方法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
)可以抛出吗?
根据 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)