Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions libcxx/include/__utility/scope_guard.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,22 @@ _LIBCPP_BEGIN_NAMESPACE_STD
template <class _Func>
class __scope_guard {
_Func __func_;
bool __moved_from_;

public:
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __scope_guard(_Func __func) : __func_(std::move(__func)) {}
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __scope_guard(_Func __func) : __func_(std::move(__func)) {}
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 ~__scope_guard() { __func_(); }

__scope_guard(const __scope_guard&) = delete;
__scope_guard(const __scope_guard&) = delete;
__scope_guard& operator=(const __scope_guard&) = delete;
__scope_guard& operator=(__scope_guard&&) = delete;

// C++17 has mandatory RVO, so we don't need the move constructor anymore to make __make_scope_guard work.
// C++14 doesn't have mandatory RVO, so we have to provide a declaration even though no compiler will ever generate
// a call to the move constructor.
#if _LIBCPP_STD_VER <= 14
__scope_guard(__scope_guard&& __other) : __func_(__other.__func_) {
_LIBCPP_ASSERT_INTERNAL(!__other.__moved_from_, "Cannot move twice from __scope_guard");
__other.__moved_from_ = true;
}
__scope_guard(__scope_guard&&);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this approach is better than having dead code. @ldionne thoughts?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I like this a lot better than the previous approach. There's not much harm in providing this private declaration.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh... this actually has to be public. Sometimes my brain just turns off. Does that change your thoughts on this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't, but thanks for checking.

#else
__scope_guard(__scope_guard&&) = delete;
#endif

__scope_guard& operator=(const __scope_guard&) = delete;
__scope_guard& operator=(__scope_guard&&) = delete;
};

template <class _Func>
Expand Down
Loading