DConf 2013 Day 1 Talk 2 (Copy and Move Semantics)
Diggory
diggsey at googlemail.com
Sat May 11 14:40:13 PDT 2013
>
> unique is interesting, and holds many promises. However, its
> effects may
> be wide-spanning and have many corner case.
>
> In addition to mutability, unique applies to shared/unshared -
> a unique
> value may safely be moved to another thread.
>
> Pure functions whose parameters are all unique or value types
> will always
> return a unique result. (Note that this is similar to how pure
> function
> results are now implicitly castable to immutable, but unique is
> stricter)
>
> For unique values not to lose unicity when passed to functions,
> there
> must be ways to specify that the function will not create new
> aliases to
> the passed value. scope might fit the bill here, otherwise
> something like
> lent must be added.
That's solved by the rule that "unique" values can only be moved
not copied. To pass a "unique" parameter by value to a function
the original must be invalidated in the process. The only other
way would be to pass by reference, in which case the function
argument must also be declared "unique".
The rule about pure functions returning "unique" is not in
general true - if it returns a class which has a pointer to
itself, or a pointer to another class which has a pointer to
itself then the return value is not unique. The return value must
specifically be declared unique.
The only problem I can see is with the "this" pointer:
- If we have unique and non-unique functions it means duplicating
everything, or at least remembering to add the "unique" attribute.
- Unique would then be both a type modifier and a function
attribute
- It's not immediately obvious what operations can be performed
by a "unique" member function.
- It is not simply equivalent to marking the "this" parameter as
unique because that would mean erasing the argument passed in for
that parameter, ie. invalidating the object!
But I think that can also be solved satisfactorily:
- Make the unique-ness of a member function something which is
implicitly determined by the compiler based on its content.
- Any function which only dereferences the "this" pointer can
safely be marked "unique" internally, and therefore can be called
on a unique variable. If it copies the "this" pointer (auto x =
this) then it is not "unique".
More information about the Digitalmars-d
mailing list