On Fri, Dec 7, 2012 at 8:59 PM, Jonathan M Davis <jmdavisp...@gmx.com>wrote:
> On Friday, December 07, 2012 18:18:30 Gor Gyolchanyan wrote: > > Consider this example: > > this(this) > > { > > _array = _array.dup; > > > Array!int one = Array!int(1, 2, 3, 4, 5); > > immutable Array!int two = one; //Error: conversion error from Array!(int) > > to immutable(Array!(int)) > > } > > I enforce value-type semantics by duplicating the arrays on copy, so it > > should behave like a value type with no indirections (implicitly convert > to > > immutable). > > What do I need to do for this to work? > > Postblit constructors don't work with const or immutable. If I understand > correctly, Walter and Andrei's solution is to introduce copy constructors, > but > while they've discussed their solution in private, they haven't discussed > it > in detail in the newsgroup. > > But when you think about how postblit constructors work, there's really no > way > to make them work with const or immutable. postblit does a bitwise copy of > the > object being copied and then allows you to reassign the member variables > other > stuff (e.g. a deep copy). That reassignment is illegal with const or > immutable, > and allowing it would violate the type system. You need a way to just do > _one_ > copy rather than copy and then edit - so basically, you need a copy > constructor. > > Regardless, this is definitely one of the issues with const and immutable > that > needs to be fixed for them to be completely viable. > > - Jonathan M Davis > My workaround is to cast away constness. This is safe under my circumstances, because I see to it that it remains unique and doesn't leak mutable references, but it's still a gross hack. -- Bye, Gor Gyolchanyan.