diff --git a/include/boost/parser/detail/stl_interfaces/detail/pipeable_view.hpp b/include/boost/parser/detail/stl_interfaces/detail/pipeable_view.hpp index d8760b5a..e38e4ea3 100644 --- a/include/boost/parser/detail/stl_interfaces/detail/pipeable_view.hpp +++ b/include/boost/parser/detail/stl_interfaces/detail/pipeable_view.hpp @@ -68,23 +68,23 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { { template friend constexpr auto operator|(R && r, Derived & d) - -> decltype(((Derived &&) d)((R &&) r)) + -> decltype((std::forward(d))(std::forward(r))) { - return ((Derived &&) d)((R &&) r); + return (std::forward(d))(std::forward(r)); } template friend constexpr auto operator|(R && r, Derived const & d) - -> decltype(((Derived &&) d)((R &&) r)) + -> decltype((std::forward(d))(std::forward(r))) { - return ((Derived &&) d)((R &&) r); + return (std::forward(d))(std::forward(r)); } template friend constexpr auto operator|(R && r, Derived && d) - -> decltype(((Derived &&) d)((R &&) r)) + -> decltype((std::forward(d))(std::forward(r))) { - return ((Derived &&) d)((R &&) r); + return (std::forward(d))(std::forward(r)); } }; @@ -109,10 +109,10 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto - operator()(R && r) & -> decltype(this->right_(this->left_((R &&) r))) + operator()(R && r) & -> decltype(this->right_(this->left_(std::forward(r)))) #endif { - return right_(left_((R &&) r)); + return right_(left_(std::forward(r))); } #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS @@ -123,10 +123,10 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto operator()( - R && r) const & -> decltype(this->right_(this->left_((R &&) r))) + R && r) const & -> decltype(this->right_(this->left_(std::forward(r)))) #endif { - return right_(left_((R &&) r)); + return right_(left_(std::forward(r))); } #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS @@ -137,10 +137,10 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto operator()(R && r) && -> decltype(std::move( - this->right_)(std::move(this->left_)((R &&) r))) + this->right_)(std::move(this->left_)(std::forward(r)))) #endif { - return std::move(right_)(std::move(left_)((R &&) r)); + return std::move(right_)(std::move(left_)(std::forward(r))); } T left_; diff --git a/include/boost/parser/detail/stl_interfaces/detail/view_closure.hpp b/include/boost/parser/detail/stl_interfaces/detail/view_closure.hpp index b96ad653..3e7c0ac0 100644 --- a/include/boost/parser/detail/stl_interfaces/detail/view_closure.hpp +++ b/include/boost/parser/detail/stl_interfaces/detail/view_closure.hpp @@ -40,10 +40,10 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto operator()(R && r) & -> decltype( - Func{}((R &&) r, std::declval &>().value_...)) + Func{}(std::forward(r), std::declval &>().value_...)) #endif { - return Func{}((R &&) r, static_cast &>(*this).value_...); + return Func{}(std::forward(r), static_cast &>(*this).value_...); } #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS @@ -55,11 +55,11 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto operator()(R && r) const & -> decltype( - Func{}((R &&) r, std::declval const &>().value_...)) + Func{}(std::forward(r), std::declval const &>().value_...)) #endif { return Func{}( - (R &&) r, static_cast const &>(*this).value_...); + std::forward(r), static_cast const &>(*this).value_...); } #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS @@ -71,10 +71,10 @@ namespace boost::parser::detail { namespace stl_interfaces { namespace detail { #else template constexpr auto operator()(R && r) && -> decltype( - Func{}((R &&) r, std::declval &&>().value_...)) + Func{}(std::forward(r), std::declval &&>().value_...)) #endif { - return Func{}((R &&) r, static_cast &&>(*this).value_...); + return Func{}(std::forward(r), static_cast &&>(*this).value_...); } }; diff --git a/include/boost/parser/detail/text/detail/all_t.hpp b/include/boost/parser/detail/text/detail/all_t.hpp index 7e65b607..b6530bf2 100644 --- a/include/boost/parser/detail/text/detail/all_t.hpp +++ b/include/boost/parser/detail/text/detail/all_t.hpp @@ -122,7 +122,7 @@ namespace boost::parser::detail::text::detail { { using T = remove_cv_ref_t; if constexpr (view) - return (R &&) r; + return std::forward(r); else if constexpr (can_ref_view) return ref_view(r); else diff --git a/include/boost/parser/replace.hpp b/include/boost/parser/replace.hpp index 58bcf916..80a0705e 100644 --- a/include/boost/parser/replace.hpp +++ b/include/boost/parser/replace.hpp @@ -612,10 +612,10 @@ namespace boost::parser { std::is_same_v) { // (r, parser, skip, replacement, trace) case return impl( - (R &&) r, + std::forward(r), parser, skip, - (ReplacementR &&) replacement, + std::forward(replacement), trace_mode); } else if constexpr ( is_range> && @@ -623,10 +623,10 @@ namespace boost::parser { std::is_same_v) { // (r, parser, replacement, trace) case return impl( - (R &&) r, + std::forward(r), parser, parser_interface>{}, - (SkipParser &&) skip, + std::forward(skip), replacement); } else { static_assert( @@ -654,7 +654,7 @@ namespace boost::parser { trace trace_mode = trace::off) const { return replace_view( - to_range::call((R &&) r), + to_range::call(std::forward(r)), parser, skip, to_range< diff --git a/include/boost/parser/search.hpp b/include/boost/parser/search.hpp index ef54c945..5d17096f 100644 --- a/include/boost/parser/search.hpp +++ b/include/boost/parser/search.hpp @@ -52,7 +52,7 @@ namespace boost::parser { return BOOST_PARSER_SUBRANGE( first, plus_strlen(first)); } else { - return (R &&) r; + return std::forward(r); } } else { if constexpr (ToCommonRange) { @@ -60,7 +60,7 @@ namespace boost::parser { first, plus_strlen(first)) | as_utf; } else { - return (R &&) r | as_utf; + return std::forward(r) | as_utf; } } } else if constexpr (text::detail::is_bounded_array_v) { @@ -76,7 +76,7 @@ namespace boost::parser { as_utf; } } else { - return (R &&) r | as_utf; + return std::forward(r) | as_utf; } } }; @@ -87,7 +87,7 @@ namespace boost::parser { template static constexpr R && call(R && r) { - return (R &&) r; + return std::forward(r); } }; @@ -150,7 +150,7 @@ namespace boost::parser { { using value_type = range_value_t; if constexpr (std::is_same_v) { - return detail::search_impl((R &&) r, parser, skip, trace_mode); + return detail::search_impl(std::forward(r), parser, skip, trace_mode); } else { auto r_unpacked = detail::text::unpack_iterator_and_sentinel( text::detail::begin(r), text::detail::end(r)); @@ -194,7 +194,7 @@ namespace boost::parser { trace trace_mode = trace::off) { return detail::search_repack_shim( - detail::to_range::call((R &&) r), parser, skip, trace_mode); + detail::to_range::call(std::forward(r)), parser, skip, trace_mode); } /** Returns a subrange to the first match for parser `parser` in `[first, @@ -255,7 +255,7 @@ namespace boost::parser { trace trace_mode = trace::off) { return parser::search( - (R &&) r, + std::forward(r), parser, parser_interface>{}, trace_mode); @@ -607,7 +607,7 @@ namespace boost::parser { std::is_same_v) { // (r, parser, trace) case return impl( - (R &&) r, + std::forward(r), parser, parser_interface>{}, skip); @@ -615,7 +615,7 @@ namespace boost::parser { detail::is_parser_iface && std::is_same_v) { // (r, parser, skip, trace) case - return impl((R &&) r, parser, skip, trace_mode); + return impl(std::forward(r), parser, skip, trace_mode); } else { static_assert( sizeof(R) == 1 && false, @@ -640,7 +640,7 @@ namespace boost::parser { trace trace_mode = trace::off) const { return search_all_view( - to_range::call((R &&) r), parser, skip, trace_mode); + to_range::call(std::forward(r)), parser, skip, trace_mode); } #endif diff --git a/include/boost/parser/split.hpp b/include/boost/parser/split.hpp index 6b554763..a8249e4c 100644 --- a/include/boost/parser/split.hpp +++ b/include/boost/parser/split.hpp @@ -324,7 +324,7 @@ namespace boost::parser { std::is_same_v) { // (r, parser, trace) case return impl( - (R &&) r, + std::forward(r), parser, parser_interface>{}, skip); @@ -332,7 +332,7 @@ namespace boost::parser { detail::is_parser_iface && std::is_same_v) { // (r, parser, skip, trace) case - return impl((R &&) r, parser, skip, trace_mode); + return impl(std::forward(r), parser, skip, trace_mode); } else { static_assert( sizeof(R) == 1 && false, @@ -357,7 +357,7 @@ namespace boost::parser { trace trace_mode = trace::off) const { return split_view( - to_range::call((R &&) r), parser, skip, trace_mode); + to_range::call(std::forward(r)), parser, skip, trace_mode); } #endif diff --git a/include/boost/parser/transform_replace.hpp b/include/boost/parser/transform_replace.hpp index 2dac85ae..bea52437 100644 --- a/include/boost/parser/transform_replace.hpp +++ b/include/boost/parser/transform_replace.hpp @@ -292,7 +292,7 @@ namespace boost::parser { using value_type = range_value_t; if constexpr (std::is_same_v) { return detail::attr_search_impl( - (R &&) r, parser, skip, trace_mode); + std::forward(r), parser, skip, trace_mode); } else { auto r_unpacked = detail::text::unpack_iterator_and_sentinel( text::detail::begin(r), text::detail::end(r)); @@ -741,7 +741,7 @@ namespace boost::parser { std::is_same_v) { // (r, parser, skip, f, trace) case return impl( - to_range::call((R &&) r), + to_range::call(std::forward(r)), parser, skip, (F &&) f, @@ -754,10 +754,10 @@ namespace boost::parser { std::is_same_v) { // (r, parser, f, trace) case return impl( - to_range::call((R &&) r), + to_range::call(std::forward(r)), parser, parser_interface>{}, - (SkipParser &&) skip, + std::forward(skip), f); } else { static_assert( @@ -785,7 +785,7 @@ namespace boost::parser { trace trace_mode = trace::off) const { return transform_replace_view( - (R &&) r, + std::forward(r), parser, skip, utf_rvalue_shim<