| namespace sr | namespace sr | ||||
| { | { | ||||
| namespace detail | |||||
| { | |||||
| template<class T, class U, | |||||
| class R = std::conditional_t<std::is_nothrow_constructible_v<T, U>, U&&, U> | |||||
| > | |||||
| constexpr R forward_if_nothrow_constructible(U&& arg) | |||||
| { | |||||
| return std::forward<U>(arg); | |||||
| } | |||||
| } | |||||
| template<class R, class D> | template<class R, class D> | ||||
| class unique_resource | class unique_resource | ||||
| > | > | ||||
| explicit unique_resource(RR&& r, DD&& d) noexcept((std::is_nothrow_constructible_v<R, RR> || std::is_nothrow_constructible_v<R, RR&>) | explicit unique_resource(RR&& r, DD&& d) noexcept((std::is_nothrow_constructible_v<R, RR> || std::is_nothrow_constructible_v<R, RR&>) | ||||
| && (std::is_nothrow_constructible_v<D, DD> || std::is_nothrow_constructible_v<D, DD&>)) | && (std::is_nothrow_constructible_v<D, DD> || std::is_nothrow_constructible_v<D, DD&>)) | ||||
| : m_resource(std::forward<RR>(r), scope_exit{[&r, &d] { d(r); }}), | |||||
| m_deleter(std::forward<DD>(d), scope_exit{[this, &d] { d(get()); }}), | |||||
| : m_resource(detail::forward_if_nothrow_constructible<R, RR>(std::forward<RR>(r)), scope_exit{[&r, &d] { d(r); }}), | |||||
| m_deleter(detail::forward_if_nothrow_constructible<D, DD>(std::forward<DD>(d)), scope_exit{[this, &d] { d(get()); }}), | |||||
| m_execute_on_destruction(true) | m_execute_on_destruction(true) | ||||
| { | { | ||||
| } | } |