Steven Schveighoffer:
There is no guarantee that the incoming array from a variadic
function is heap-based.
But an interesting way to deal with it is that you can overload
with an explicit slice parameter, and the variadic version will
ONLY bind to a variadic call.
For example, in dcollections' ArrayList I have two constructors:
/**
* Create an array list based on a number of elements.
*/
this(V[] elems...)
{
_array = elems.dup;
}
/**
* Use an array as the backing storage. This does not
duplicate the
* array. Use new ArrayList(storage.dup) to make a
distinct copy. Beware
* of using a stack-based array when using this constructor!
*/
this(V[] storage)
{
_array = storage;
}
To avoid those bugs I have suggested the simpler possible thing:
(V[] elems...) to dup the data on the heap every time. In theory
if you write "(scope V[] elems...)" it will be free to not dup
the data, avoiding the heap allocation and the associated little
performance loss. In practice as you know "scope" is not yet
implemented. D2 language is not close to being fully implemented.
Bye,
bearophile