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