To come back to destructors and immutable objects:

Even without the default initialized variables issue it is possible to modify immutable data:

struct S {
  int[] bar;

  ~this() {
    bar[0] = 123;
  }
}

void foo(immutable(int[]) i) {
  immutable(S) s = immutable S(i);
}

void main() {
  immutable array = [42, 42];
  foo(array);
  // fails
  assert(array == [42, 42]);
}

I'm not sure whether ~this() should be forbidden to modify immutable data. Consider e.g. some fields need to be free'd. If someone else is using references to such a field after ~this() -> segfault, but it could be seen as analogon to the list of undefined operations on pointer to GC memory. Additionally the same happens already for stack allocated fields like int[4] inside a (mutable/const/immutable) struct.

Reply via email to