On 11/10/2013 12:07 PM, Kenji Hara wrote:
Condider a case that copying "inout struct" inside inout function....
struct S {
int[] arr;
this(this) ??? { }
}
int[] foo(inout S src)
{
S dst = src; // copy inout S to S
return dst.arr;
}
If the struct S has postblit, what shold be done for "copying S from
inout to mutable"?
1. You cannot modify elements of arr field, because originally it may be
immutable.
2. You must re-initialize arr field by unique expression, otherwise it
may break type system
2. is not necessary in the following case:
inout(int)[] foo(inout S src){
inout(S) dst = src; // copy inout S to inout S
return dst.arr;
}
But as far as I understand, there is no other postblit than inout to invoke under the current proposal, hence this could be wasteful.I think it is a good design, but maybe still incomplete.
The requirements are exactly same as what necessary for unique postblit.
Essentially "creating unique copy" is exactly same as "treating the copy
source as inout".
We could eg. keep
this(this)inout{ ... }
as the unique postblit and have
this(inout this)inout{ ... }
as a postblit for identically qualified source and target.