On Thursday, 12 December 2013 at 18:20:25 UTC, bearophile wrote:
Namespace:
Your gig:
https://github.com/D-Programming-Language/dmd/pull/2952#discussion_r8288045
This is part of the thread there:
Furhtermore, what if we indeed want to pass a dynamic array
?<<
Kenji> Use cast. In real world, if overloaded function takes
both int[] and int[3], normally int[3] version would provide
specialized implementation for 3 length arrays (eg. unroll the
loop to operate each elements of the given array). Therefore
force to invoke int[] version with array literal is not usual
situation. Cast will fit in such case.<
If I have a function foo that takes a slice as input, and I
want to pass it two arrays, the first time allocated on the
heap and the second on the stack, I have to use an auxiliary
variable:
void foo(int[]) {}
void main() {
foo([1, 2, 3]);
int[3] tmp = [4, 5, 6];
foo(tmp);
}
There's a known issue that the function foo takes the slice of
stack allocated data. Today some peoples argue that it is unsafe
operation and should be disallowed in @safe code.
With the []s syntax it should become:
void foo(int[]) {}
void main() {
foo([1, 2, 3]);
foo([4, 5, 6]s);
}
But I don't know how much common is such need.
In the Rust language when you write an array literal you always
prefix it with a symbol, to tell the compiler where you want to
allocate it. So I think it's not so useless :-)
Bye,
bearophile
I'm afraid that allowing foo([4, 5, 6]s) would easily cause
memory corruption. I don't want to hurt language future by the
trivial syntactic sugar.
Kenji Hara