On Friday, 27 July 2018 at 14:34:54 UTC, Steven Schveighoffer wrote:
The problem here is that inout(immutable(int)) is equivalent to immutable(int).

That is, all flavors of mutability are equivalent to immutable(int):

/*mutable*/(immutable(int)) => immutable(int)
      const(immutable(int)) => immutable(int)
  immutable(immutable(int)) => immutable(int)

So the compiler really looks at your wrap instantiation like this;

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

Ah ok, so the compiler remove inout behind me back here? (And then tells me it needs to be there? :p)


which triggers the (really bad) message.

I'd ask, why are you even worrying about explicit instantiation? Why not just wrap(3)?

Just because I don't see why it should not work really. Why not allow wrap!(immutable int)(3)?


or (if you really want to test it) wrap(immutable(int)(3))?


To make it compile successfully you can either:

1) Chance immutable to const, then it works for some reason.

Because immutable(const(int)) => immutable(int), so the compiler can't remove the inout behind your back.

2) Change the line to: "auto si = wrap(cast(immutable int)3);" - i.e. do not explicitly provide type information.

Yep, do this :)

Note that the point of inout is 2-fold:

1. reduce template instantiations. In fact, wrap!int works for const, mutable and immutable int. 2. ENSURE that the data isn't modified, even in the case of mutable parameters.

Thanks for the explanations! For some reason it's hard to get it all to *just work* right now without the template this. But it's probably some minor detail I'm just overlooking...


-Steve


Reply via email to