Created on 2024-04-13.00:00:00 last changed 7 months ago
Proposed resolution:
This wording is relative to N4981.
Modify [range.utility.conv.to] as indicated:
template<class C, input_range R, class... Args> requires (!view<C>) constexpr C to(R&& r, Args&&... args);-1- Mandates: C is a cv-unqualified class type.
-2- Returns: An object of type C constructed from the elements of r in the following manner:
(2.1) — […]
(2.1.1) — […]
(2.1.2) — […]
(2.1.3) — […]
(2.1.4) — Otherwise, if
(2.1.4.1) — constructible_from<C, Args...> is true, and
(2.1.4.2) — container-appendable<C, range_reference_t<R>> is true:
C c(std::forward<Args>(args)...); subrange s{r}; if constexpr (sized_range<R>requires { s.size(); } && reservable-container<C>) c.reserve(static_cast<range_size_t<C>>(ranges::size(r)s.size())); ranges::for_each(rs, container-append(c));
ranges::to currently only reserves when r satisfies sized_range. However, we can also extract its size when r is an input_range that its sentinel-iterator pair satisfies sized_sentinel_for.
Given that we have specifically designed the decision tree, I see no reason not to reserve in this case, since we'd be calling ranges::begin(r) anyway.History | |||
---|---|---|---|
Date | User | Action | Args |
2024-04-14 08:49:20 | admin | set | messages: + msg14058 |
2024-04-13 00:00:00 | admin | create |