How to get an inout constructor working with a template wrapper

aliak something at something.com
Tue Jul 31 21:29:46 UTC 2018


On Tuesday, 31 July 2018 at 12:37:34 UTC, Steven Schveighoffer 
wrote:
> On 7/29/18 1:46 PM, aliak wrote:
>> On Sunday, 29 July 2018 at 12:45:48 UTC, Steven Schveighoffer 
>> wrote:
>>>>
>>>> Am I applying inout incorrectly?
>>>
>>> No, you need to apply it to wrap as well. I can't get 
>>> run.dlang.io to work for posting a link, so here is my 
>>> modified version:
>>>
>> 
>> Ah bugger, right!
>> 
>> Ok so there's no way to make explicit instantiation involving 
>> immutable work in the face of an inout parameter? Seems rather 
>> inconsistent no?
>
> It's not that there's no way, the issue is simply that you are 
> explicitly instantiating incorrectly.
>
> wrap!int(immutable(int)(3));
>
> -Steve

Ok bear with me, but I'm really confused why 
"wrap!int(immutable(int)(3))" is "correct".

This all seems very inconsistent:

1. wrap!(int)(3); // ok
2. wrap!(const int)(3); // ok
3. wrap!(immutable int)(3); // nope
4. wrap!(int)(3); // ok
5. wrap!(const int)(const(int)(3)); // ok
6. wrap!(immutable int)(immutable(int)(3)); // ok!

So for 3, compiler sees the instantiation:

  inout(W!(immutable int)) wrap(immutable(int))

If I understood you correctly?

But then what does it see in number 6, which works fine? And why 
is 2 ok if 3 is not? And finally, why can't the compiler leave 
the inout there and then it doesn't need to complain about it?

Cheers,
- Ali


More information about the Digitalmars-d-learn mailing list