From 65f3ea60ddd578b2822e804f647c2cd3628a28ab Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Tue, 6 Aug 2024 08:48:13 -0500 Subject: [PATCH] Use as_const to remove any possibility of use-after-move (#272) --- include/boost/unordered/detail/type_traits.hpp | 11 +++++++++++ include/boost/unordered/unordered_map.hpp | 4 ++-- include/boost/unordered/unordered_set.hpp | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/boost/unordered/detail/type_traits.hpp b/include/boost/unordered/detail/type_traits.hpp index 4369df2e..f99f7f42 100644 --- a/include/boost/unordered/detail/type_traits.hpp +++ b/include/boost/unordered/detail/type_traits.hpp @@ -219,6 +219,17 @@ namespace boost { using iter_to_alloc_t = typename std::pair const, iter_val_t >; #endif + +#if BOOST_CXX_VERSION < 201703L + template + constexpr typename std::add_const::type& as_const(T& t) noexcept + { + return t; + } + template void as_const(const T&&) = delete; +#else + using std::as_const; +#endif } // namespace detail } // namespace unordered } // namespace boost diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 47986d4d..6b7418b0 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -198,7 +198,7 @@ namespace boost { template std::pair emplace(Args&&... args) { return table_.emplace_unique( - table::extractor::extract(std::forward(args)...), + table::extractor::extract(detail::as_const(args)...), std::forward(args)...); } @@ -206,7 +206,7 @@ namespace boost { iterator emplace_hint(const_iterator hint, Args&&... args) { return table_.emplace_hint_unique(hint, - table::extractor::extract(std::forward(args)...), + table::extractor::extract(detail::as_const(args)...), std::forward(args)...); } diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index d891a418..eae846dd 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -194,7 +194,7 @@ namespace boost { template std::pair emplace(Args&&... args) { return table_.emplace_unique( - table::extractor::extract(std::forward(args)...), + table::extractor::extract(detail::as_const(args)...), std::forward(args)...); } @@ -202,7 +202,7 @@ namespace boost { iterator emplace_hint(const_iterator hint, Args&&... args) { return table_.emplace_hint_unique(hint, - table::extractor::extract(std::forward(args)...), + table::extractor::extract(detail::as_const(args)...), std::forward(args)...); }