In functions it may be necessary (e.g. for scoping reasons) to assign the return value to a variable and return it later. If the return value is a inout/const/immutable class reference, this fails (cannot modify inout/const/immutable expression...). For const/immutable this is quite easily fixed using Rebindable, but not so for inout...
----
import std.typecons : Rebindable;
class A { }
class C
{
private A _a;
@property const(A) aConst() const nothrow @nogc @safe
{
const A retVal;
retVal = _a; // ERROR: cannot modify const expression retVal
// in this simple case, the error could be avoided by assigning
// directly in the declaration of retVal, but something like an
// if or try/catch block may force to declare the variable separate
// from assigning its value.
return retVal;
}
@property const(A) aConstRebindable() const nothrow @nogc @safe
{
Rebindable!(const A) retVal;
retVal = _a; // WORKS
return retVal;
}
@property inout(A) aInoutRebindable() inout nothrow @nogc @safe
{
Rebindable!(inout A) retVal;
retVal = _a; // ERROR: cannot modify inout expression retVal
return retVal;
}
}
----
Same problem with UnqualRef, which does the same, but also removes shared.
Comment #1 by robert.schadek — 2024-12-01T16:35:23Z