Generic operator overloading for immutable types?

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jun 13 14:58:45 PDT 2017


On 06/13/2017 10:50 PM, Steven Schveighoffer wrote:
> const(inout) actually *is* a thing :)
> 
> It's a type constructor that can be implicitly cast from immutable. This 
> has advantages in some cases.
> 
> See (horribly written) table at the bottom if the inout function section 
> here: http://dlang.org/spec/function.html#inout-functions
> 
> Also I talked about it last year at Dconf 2016: 
> http://dconf.org/2016/talks/schveighoffer.html

Huh. There it is.

Took me some experimenting to understand what it does. If anyone else is 
interested, this is where it clicked for me:

----
inout(int*) f(inout int* x, inout int* y)
{
     return y;
}

inout(int*) g(inout int* x)
{
     immutable int* y;
     return f(x, y); /* Error: cannot implicitly convert expression f(x, 
y) of type inout(const(int*)) to inout(int*) */
}
----

That code can't compile because g's inout return type says that it has 
to return a mutable result for a mutable argument x. But y is immutable, 
so that can't work.

We see in the error message that `f(x, y)` results in a `inout(const 
int*)`. We can change g's return type to that (or `auto`) and the code 
compiles. `inout const` enforces that the result is const or immutable. 
It cannot be mutable.

This raises a question: There is no analogous inout variant that goes 
the other way (to mutable and const but not immutable), is there?

This code doesn't work, and I see no way to make it work:

----
inout(int*) f(inout int* x, inout int* y)
{
     return y;
}

auto g(inout int* x)
{
     int* y;
     return f(x, y);
}

void main()
{
     int* x;
     int* r1 = g(x);
}
----


More information about the Digitalmars-d-learn mailing list