On Saturday, 25 November 2017 at 21:59:54 UTC, Ali Çehreli wrote:
On 11/25/2017 01:51 PM, Dave Jones wrote:
> What does the "inout" after front() do here...
>
>
> @property ref inout(T) front() inout
> {
> assert(_data.refCountedStore.isInitialized);
> return _data._payload[0];
> }
>
> Cant seem to find an explanation in the docs or forums :(
It's for member functions. Without it, and if you needed, you
would have to write separate functions for mutable, const, and
immutable objects of that type.
For example, the following function works for all three
qualifications. It won't compile if you remove that inout:
struct S {
int i;
@property ref inout(int) front() inout {
return i;
}
}
void main() {
auto m = S(1);
auto c = const(S)(2);
static assert(is(typeof(m.front) == int));
static assert(is(typeof(c.front) == const(int)));
}
Ali
So it makes it a const/immutable/mutable method depending on
whether the instance it is called on is const/immutable/mutable?
So
@property ref inout(int) front() inout {
return i++;
}
Would fail if you called it on an immutable instance of S.