21.10.2013 17:31, Krzysztof Ciebiera пишет:
Is the following compiler behavior consistent with language specification?
import std.stdio;
void main()
{
int a[][] = [[1,2,3]];
foreach(x; a)
{
x[0] = 0;
x ~= 4;
}
writeln(a);
}
I understand why thw program could output [1,2,3] (like in C++ without
&) or [0,2,3,4] (python, C++ ref). But [0,2,3]? It was unpleasant surprise.
It's expected.
foreach(ref x; a) == C++ with &
but without ref you get the first element of a - i.e. [1, 2, 3] then set
x[0] = 0 so you get [0, 2, 3]. But when you append 4 you append it to
local copy of x - because there is no 'ref'. So your local copy of x
became [0, 2, 3, 4] but when scope is gone you get unmodified copy of a
with old array [0, 2, 3]. Changing the first element without ref
possible because you modify inner array which is reference itself.