On 11/13/2012 3:47 PM, Daniel Murphy wrote:
"Walter Bright" <newshou...@digitalmars.com> wrote in message
news:k7t125$7on$1...@digitalmars.com...
A Unique!T can only be initialized by:
1. a destructive read of another instance of Unique!T
2. an expression that can be determined to generated an isolated
pointer
#2 is the interesting bit. That requires some compiler support, sort of
like:
__unique(Expression)
which will allow it through if Expression is some combination of new, pure
functions, and other Unique pointers.
This is somewhat possible in the current language. The makeU function can
be an arbitrarily complicated strongly pure function.
void funcTakingUnique(U, T...)(U function(T) pure makeU, T args) if
(is(typeof({ immutable i = makeU(args) }) // If it converts to immutable, it
is either unique or immutable
{
auto unique = makeU(args); // guaranteed to be unique/immutable
}
class A
{
this(int a, string b) {}
}
void main()
{
funcTakingUnique!A(A function(int a, string b) { return new A(a, b); },
4, "Awesome");
}
This is a great insight.