1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-11-11 01:37:41 +03:00

Make OnScopeEnd valid even when non-copy elided

OnScopeEnd was relying on copy elision to avoid temporary destructor
calls that would run the scope end function too soon.
This commit is contained in:
Maxime Coste 2018-05-01 22:38:51 +10:00
parent 1fb53ca712
commit 6777c14697

View File

@ -65,11 +65,18 @@ class OnScopeEnd
{
public:
[[gnu::always_inline]]
OnScopeEnd(T func) : m_func(std::move(func)) {}
OnScopeEnd(T func) : m_func{std::move(func)}, m_valid{true} {}
[[gnu::always_inline]]
~OnScopeEnd() { m_func(); }
OnScopeEnd(OnScopeEnd&& other)
: m_func{std::move(other.m_func)}, m_valid{other.m_valid}
{ other.m_valid = false; }
[[gnu::always_inline]]
~OnScopeEnd() { if (m_valid) m_func(); }
private:
bool m_valid;
T m_func;
};