Version of task usable from @safe code. Usage mechanics are
identical to the non-@safe case, but safety introduces some restrictions:
1. fun must be @safe or @trusted.
2. F must not have any unshared aliasing as defined by
std.traits.hasUnsharedAliasing. This means it
may not be an unshared delegate or a non-shared class or struct
with overloaded opCall. This also precludes accepting template
alias parameters.
3. Args must not have unshared aliasing.
4. fun must not return by reference.
5. The return type must not have unshared aliasing unless fun is
pure or the Task is executed via executeInNewThread instead
of using a TaskPool.
Version of task usable from @safe code. Usage mechanics are identical to the non-@safe case, but safety introduces some restrictions:
1. fun must be @safe or @trusted.
2. F must not have any unshared aliasing as defined by std.traits.hasUnsharedAliasing. This means it may not be an unshared delegate or a non-shared class or struct with overloaded opCall. This also precludes accepting template alias parameters.
3. Args must not have unshared aliasing.
4. fun must not return by reference.
5. The return type must not have unshared aliasing unless fun is pure or the Task is executed via executeInNewThread instead of using a TaskPool.