On Thursday, 31 October 2013 at 15:11:48 UTC, Daniel Davidson wrote:
The following seems to work, but feels like luck. When foo returns rc should be taken off the stack. If I recall, in C++ something like this would crash, but why not here?

This ineed runs by luck. In C++ it would not necessarily crash, but it is UB like in D.

You can workaround issue by:

import std.stdio;

struct S
{
        int[] data;
        const this(this) { S *s = cast(S*)&this; s.data = s.data.dup; }
}

struct SS
{
        const S s;
}

void main()
{
        S s1, s2;
        s1.data = s2.data = [0,1];
        s1 = s2;
        s2.data[0] = 1;
        writeln(s1.data);
}

but this breaks constness and penalty is that function with casts cannot be run in safe code. (However in this case there is no logical mutation because 's' keeps its value. Probably self modifying const postblits should be allowed with restriction that it is programmer duty to ensure that const object is duplicated, but not mutated - at least judging by postblit definition it is reasonable assumption with some degree of confidence.)

Reply via email to