RefPtr: use inconditional noexcept specification on destructor

The conditional specification could end up being recursive,
assume destructors must be (as is the C++ default) noexcept.
This commit is contained in:
Maxime Coste 2018-02-28 15:04:00 +11:00
parent 0d838f80a0
commit bebc81ebe1

View File

@ -22,7 +22,7 @@ struct RefCountable
struct RefCountablePolicy struct RefCountablePolicy
{ {
static void inc_ref(RefCountable* r, void*) noexcept { ++r->refcount; } static void inc_ref(RefCountable* r, void*) noexcept { ++r->refcount; }
static void dec_ref(RefCountable* r, void*) noexcept(noexcept(r->~RefCountable())) { if (--r->refcount == 0) delete r; } static void dec_ref(RefCountable* r, void*) noexcept { if (--r->refcount == 0) delete r; }
static void ptr_moved(RefCountable*, void*, void*) noexcept {} static void ptr_moved(RefCountable*, void*, void*) noexcept {}
}; };
@ -31,7 +31,7 @@ struct RefPtr
{ {
RefPtr() = default; RefPtr() = default;
explicit RefPtr(T* ptr) : m_ptr(ptr) { acquire(); } explicit RefPtr(T* ptr) : m_ptr(ptr) { acquire(); }
~RefPtr() noexcept(noexcept(std::declval<RefPtr>().release())) { release(); } ~RefPtr() noexcept { release(); }
RefPtr(const RefPtr& other) : m_ptr(other.m_ptr) { acquire(); } RefPtr(const RefPtr& other) : m_ptr(other.m_ptr) { acquire(); }
RefPtr(RefPtr&& other) RefPtr(RefPtr&& other)
noexcept(noexcept(std::declval<RefPtr>().moved(nullptr))) noexcept(noexcept(std::declval<RefPtr>().moved(nullptr)))
@ -102,8 +102,7 @@ private:
} }
[[gnu::always_inline]] [[gnu::always_inline]]
void release() void release() noexcept
noexcept(noexcept(Policy::dec_ref(nullptr, nullptr)))
{ {
if (m_ptr) if (m_ptr)
Policy::dec_ref(m_ptr, this); Policy::dec_ref(m_ptr, this);