Date: Sat, 09 Aug 2025 22:45:27 +0300
On Sat, 2025-08-09 at 21:30 +0200, Jens Maurer wrote:
>
>
> On 09.08.25 21:06, Avi Kivity via Std-Proposals wrote:
> > A modern range-based solution would look like
> >
> > ```c++
> > auto result = input
> > | std::views::transform([] (size_t sz) {
> > return std::vector<int>(sz);
> > }
> > | std::ranges::to<std::vector>();
> > ```
> >
> > This is still unsatisfying, as the lambda is not concise.
>
> I disagree. The lambda is nice and readable.
>
See below.
> Also, constructors in particular seem to have
> std::initializer_list overloads occasionally,
> but you can't perfectly-forward initializer lists.
>
Seems like that's a problem with initializer lists, not with the many
facilities which use perfect forwarding.
> Oh, and I haven't used mem_fn for ages, now that std::ranges
> considers pointer-to-members invocable.
See, you prefer the conciseness. You wouldn't write a lambda to forward
the call as you have an alternative.
Note, p3312 provides the ability to expose an overload set as a
function object. If it's adopted, you'd write
auto result = input
| std::views::transform(&std::vector<int>::vector)
| std::ranges::to<std::vector>();
which I prefer to std::constructor.
>
>
> On 09.08.25 21:06, Avi Kivity via Std-Proposals wrote:
> > A modern range-based solution would look like
> >
> > ```c++
> > auto result = input
> > | std::views::transform([] (size_t sz) {
> > return std::vector<int>(sz);
> > }
> > | std::ranges::to<std::vector>();
> > ```
> >
> > This is still unsatisfying, as the lambda is not concise.
>
> I disagree. The lambda is nice and readable.
>
See below.
> Also, constructors in particular seem to have
> std::initializer_list overloads occasionally,
> but you can't perfectly-forward initializer lists.
>
Seems like that's a problem with initializer lists, not with the many
facilities which use perfect forwarding.
> Oh, and I haven't used mem_fn for ages, now that std::ranges
> considers pointer-to-members invocable.
See, you prefer the conciseness. You wouldn't write a lambda to forward
the call as you have an alternative.
Note, p3312 provides the ability to expose an overload set as a
function object. If it's adopted, you'd write
auto result = input
| std::views::transform(&std::vector<int>::vector)
| std::ranges::to<std::vector>();
which I prefer to std::constructor.
Received on 2025-08-09 19:45:31