Safe to cast to immutable and return?
vit
vit at vit.vit
Thu Jul 5 12:15:35 UTC 2018
On Thursday, 5 July 2018 at 11:15:03 UTC, Timoses wrote:
> Is this safe?
>
> class A {}
> immutable(A) getA()
> {
> A a;
> // .. do stuff with a
> // not leaking a to any functions
>
> // is this safe????
> return cast(immutable A)a;
> }
>
> What if A is replaced with A[] or A[int]?
> If it's not safe, what would be the proper way to return an
> immutable instance from a function which needs to make
> adjustments to the instance before returning it as immutable?
Try pure functions:
class A {}
A getA()pure @safe //pure whitout mutable parameters guarantees
that function doesn't leak data.
{
A a;
// .. do stuff with a
// not leaking a to any functions
// is this safe????
return a;
}
A getA2(A x)pure @safe //pure with mutable param
{
A a;
// .. do stuff with a
// not leaking a to any functions
// is this safe????
return a;
}
void test()@safe{
immutable(A) a1 = getA(); //ok
immutable(A) a2 = getA2(null); //ok
immutable(A) a3 = getA2(new A); //ok
immutable(A) a4 = getA2(a3); //error in theory can leak
}
More information about the Digitalmars-d-learn
mailing list