On Sat, 28 Oct 2023 15:27:20 GMT, Quan Anh Mai <qa...@openjdk.org> wrote:

>> Sorry I was unclear: what is the advantage of a reference here? Is it just 
>> to avoid copying
>
> @dholmes-ora Yes it helps avoid copying, especially if the copy constructor 
> is non-trivial. And I think it is more idiomatic in C++ to use references 
> here.

Using a reference here leads to unnecessary overhead when `E` is small and
trivially copyable, unless the predicate function is inlined. Pass by value is
better in that case. Of course, as noted above, if `E` is "expensive" to copy
or non-copyable then a reference is needed. Boost has this thing called
`call_traits<E>::param_type` for this issue, but I don't recommend we copy
that.

Idiomatic C++ makes the entire function a template parameter, as was suggested
earlier in this PR. That dodges this question entirely, leaving the parameter
passing decision to the predicate function where it belongs, rather than
having it imposed by GrowableArray::find.  The find function just imposes the
requirement that the predicate satisfies the appropriate constraints, e.g. it
is callable on an element reference and returns convertible to bool.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/15418#discussion_r1375386257

Reply via email to