On Thursday, 10 October 2013 at 23:06:23 UTC, qznc wrote:
Maybe the fact that D allows this implicit copy to immutable is the problem? If one could require the use of a specific function, this function could be overridden with working behavior. The following code works.


Yes - the issue arises because the language has different behavior for structs with mutable aliasing and structs without. For structs without mutable aliasing a copy is safe so crossing bounds between any of (mutable, const, immutable) is easily achieved.

import std.exception: assumeUnique;

struct MyInt
{
  int i;
  private int[] history;    // <-- Added
}

// idup for creating immutable MyInts
immutable(MyInt) idup(const MyInt mi) pure nothrow @trusted {
  MyInt cpy = MyInt(mi.i);
  return cast(immutable) cpy;
}

// special version for performance
immutable(MyInt) idup(immutable MyInt mi) pure nothrow @trusted {
  return mi;
}

unittest {
  auto a = MyInt(1);
  immutable b = a.idup;     // <-- Code does not break
}

D could either remove the implicit-copy-to-immutable or provide a special copy-constructor for immutable structs.

See this discussion: http://forum.dlang.org/thread/fmhkvogowjlduqerc...@forum.dlang.org

Reply via email to