diff options
author | Patrick Palka <ppalka@redhat.com> | 2024-11-27 11:59:38 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2024-11-27 11:59:38 -0500 |
commit | 56029c91dcadcfd1800614b7484d3dc82ca16dde (patch) | |
tree | 6e226f60e767a4a90e01da85360f5b6e11f333bd /libstdc++-v3/include/std | |
parent | 958f0025f41d8bd9812e4da91a72b1ad79496e5b (diff) | |
download | gcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.zip gcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.tar.gz gcc-56029c91dcadcfd1800614b7484d3dc82ca16dde.tar.bz2 |
libstdc++/ranges: make _RangeAdaptorClosure befriend operator|
This declares the range adaptor pipe operators a friend of the
_RangeAdaptorClosure base class so that the std module doesn't need to
export them for ADL to find them.
Note that we deliberately don't define these pipe operators as hidden
friends, see r14-3293-g4a6f3676e7dd9e.
libstdc++-v3/ChangeLog:
* include/std/ranges (views::__adaptor::_RangeAdaptorClosure):
Befriend both operator| overloads.
* src/c++23/std.cc.in: Don't export views::__adaptor::operator|.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Diffstat (limited to 'libstdc++-v3/include/std')
-rw-r--r-- | libstdc++-v3/include/std/ranges | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 5153dcc..f4b8977 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -949,8 +949,7 @@ namespace views::__adaptor // _S_has_simple_call_op to true if the behavior of this adaptor is // independent of the constness/value category of the adaptor object. template<typename _Derived> - struct _RangeAdaptorClosure - { }; + struct _RangeAdaptorClosure; template<typename _Tp, typename _Up> requires (!same_as<_Tp, _RangeAdaptorClosure<_Up>>) @@ -984,6 +983,26 @@ namespace views::__adaptor } #pragma GCC diagnostic pop + template<typename _Derived> + struct _RangeAdaptorClosure + { + // In non-modules compilation ADL finds these operators either way and + // the friend declarations are redundant. But with the std module these + // friend declarations enable ADL to find these operators without having + // to export them. + template<typename _Self, typename _Range> + requires __is_range_adaptor_closure<_Self> + && __adaptor_invocable<_Self, _Range> + friend constexpr auto + operator|(_Range&& __r, _Self&& __self); + + template<typename _Lhs, typename _Rhs> + requires __is_range_adaptor_closure<_Lhs> + && __is_range_adaptor_closure<_Rhs> + friend constexpr auto + operator|(_Lhs&& __lhs, _Rhs&& __rhs); + }; + // The base class of every range adaptor non-closure. // // The static data member _Derived::_S_arity must contain the total number of |