ketmar via Digitalmars-d-learn wrote: > On Sat, 03 Jan 2015 14:45:24 +1030 > ted via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > >> Well, I just cleared up some of my misunderstanding. >> >> I did not realise the mA (within struct Test) would be a _copy_ of arg, >> not a reference (pointer) to arg. >> >> So the more correct code snippet would be: >> >> struct A >> { >> int someInt; >> } >> >> struct Test >> { >> @property { const(A) getA() { return *mA; } } >> this( in A arg ) >> { >> mA = &arg; >> } >> >> private: >> const A* mA; >> } >> >> void main() >> { >> Test myTest1; >> A topA; >> >> topA.someInt = 100; >> >> void _someFunc( in A myA ) >> { >> myTest1 = Test(myA); >> } >> >> Test myTest2 = Test(topA); // is ok as expected >> _someFunc( topA ); >> >> >> } > nonononono! ;-) > please, don't use pointers like this. try to avoid pointers altogether, > they are VERY dangerous. as for your sample: it is already invalid. see: > > this (in A arg) { mA = &arg; } > > you are storing the address of *local* *var* *from* *stack* here. then > local will go out of scope and... BANG! everyone is dead.
Oops...true (*blush*) - should have noticed this. > >> This code snippet is me trying to understand whether I have a >> fundamental misunderstanding with const, or whether it is an issue with >> the compiler > seems that you didn't get D `const`. it's deffers from C/C++ `const`. > in most cases you don't need to use it at all. the funny thing of D > const is that const "variable" cannot be changed in any way after > assigning. that's why compiler complains: you're trying to change > variable with `const` part, which is forbidden. > > structure instance with const fields can be initialized only once, upon > creation. so did `Test myTest1;` -- you initialized `myTest1` with > default values. you can't reinitialize it later. > > in C++ constness on member doesn't impose such restrictions. this is > confusing for newcomers with C/C++ expirience. the best advice here is > "don't use `const` in D unless you are fully understand what you are > doing and how it work in D". Ironically, I'm trying to use const in an effort to understand it...but there seems to be an unusual amount of pain until I grok it. > >> I'm happy I've got a workaround (which seems to safely preserve the >> const'dness), but I still don't understand why the compiler barfs on the >> struct version as it should be 'replacing' the higher scoped >> variable.... > you don't need `const` here at all. as far as i can see you want to > tell the compiler that `mA` must not be changed after creating a > struct. to achieve that you'd better move your struct to separate > module and provide read-only getter. > > you need to move your struct to separate module 'cause `private` > modifier will not affect the code in the same module. one of the D > rules is that the code in one module can access anything that was > declared in the same module, including "private" members of > structs/classes. C++ tries to achieve that with "friend" members, but > as D has full-fledged module system, it doesn't need such tricks. > > tl;dr: don't use `const` here, provide an accessor and stop > worrying/helping the compiler. ;-) Yeah.....its one of those cases where the prototype code is getting too ugly, and a refactorisation is required.....but no time !! many thanks, ted