Skip to content

Commit a80c61c

Browse files
committed
[libc++][ranges] LWG4016: container-insertable checks do not match what container-inserter does
1 parent 482b830 commit a80c61c

File tree

1 file changed

+13
-16
lines changed
  • libcxx/include/__ranges

1 file changed

+13
-16
lines changed

libcxx/include/__ranges/to.h

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,6 @@ constexpr bool __container_appendable = requires(_Container& __c, _Ref&& __ref)
6060
requires { __c.insert(__c.end(), std::forward<_Ref>(__ref)); });
6161
};
6262

63-
template <class _Container>
64-
_LIBCPP_HIDE_FROM_ABI constexpr auto __container_append(_Container& __c) {
65-
return [&__c]<class _Ref>(_Ref&& __ref) {
66-
if constexpr (requires { __c.emplace_back(declval<_Ref>()); })
67-
__c.emplace_back(std::forward<_Ref>(__ref));
68-
else if constexpr (requires { __c.push_back(declval<_Ref>()); })
69-
__c.push_back(std::forward<_Ref>(__ref));
70-
else if constexpr (requires { __c.emplace(__c.end(), declval<_Ref>()); })
71-
__c.emplace(__c.end(), std::forward<_Ref>(__ref));
72-
else if constexpr (requires { __c.insert(__c.end(), declval<_Ref>()); })
73-
__c.insert(__c.end(), std::forward<_Ref>(__ref));
74-
};
75-
}
76-
7763
// Note: making this a concept allows short-circuiting the second condition.
7864
template <class _Container, class _Range>
7965
concept __try_non_recursive_conversion =
@@ -124,8 +110,19 @@ template <class _Container, input_range _Range, class... _Args>
124110
__result.reserve(static_cast<range_size_t<_Container>>(ranges::size(__range)));
125111
}
126112

127-
ranges::for_each(__range, ranges::__container_append(__result));
128-
113+
for (auto&& __ref : __range) {
114+
using _Ref = decltype(__ref);
115+
if constexpr (requires { __result.emplace_back(declval<_Ref>()); }) {
116+
__result.emplace_back(std::forward<_Ref>(__ref));
117+
} else if constexpr (requires { __result.push_back(declval<_Ref>()); }) {
118+
__result.push_back(std::forward<_Ref>(__ref));
119+
} else if constexpr (requires { __result.emplace(__result.end(), declval<_Ref>()); }) {
120+
__result.emplace(__result.end(), std::forward<_Ref>(__ref));
121+
} else {
122+
static_assert(requires { __result.insert(__result.end(), declval<_Ref>()); });
123+
__result.insert(__result.end(), std::forward<_Ref>(__ref));
124+
}
125+
}
129126
return __result;
130127

131128
} else {

0 commit comments

Comments
 (0)