Hi,
I was doing some tests and this code:
import std;
struct S{
string[] s = ["ABC"];
int i = 123;
}
void foo(bool b, string str){
S t1;
writeln("t1.s: ", t1.s, ", t1.s.ptr: ", t1.s.ptr, " t1.i: ",
t1.i);
if(b){
t1.s[0] = str;
}else{
t1.s = [str];
}
t1.i = 456;
S t2;
writeln("t1.s: ", t1.s, ", t1.s.ptr: ", t1.s.ptr, " t1.i: ",
t1.i);
writeln("t2.s: ", t2.s, ", t2.s.ptr: ", t2.s.ptr, " t2.i: ",
t2.i);
writeln("");
}
void main(){
foo(false, "DEF");
foo(true, "DEF");
foo(false, "XYZ");
}
Outputs:
t1.s: ["ABC"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["DEF"], t1.s.ptr: 7EFC725E6000 t1.i: 456
t2.s: ["ABC"], t2.s.ptr: 56421C6D7010 t2.i: 123
t1.s: ["ABC"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["DEF"], t1.s.ptr: 56421C6D7010 t1.i: 456
t2.s: ["DEF"], t2.s.ptr: 56421C6D7010 t2.i: 123
t1.s: ["DEF"], t1.s.ptr: 56421C6D7010 t1.i: 123
t1.s: ["XYZ"], t1.s.ptr: 7EFC725E6020 t1.i: 456
t2.s: ["DEF"], t2.s.ptr: 56421C6D7010 t2.i: 123
As you can see:
t1.s = [str];
Just changed generated a new address only for t1.s, on the other
hand:
t1.s[0] = str;
Changed the value pointed by S.s entirely (The other "instance"
t2 since points to the same address now has the new value too).
Is this intended?
Matheus.