"<Type> is not mutable" when using ref return type
Jonathan M Davis
jmdavisProg at gmx.com
Wed May 18 22:12:07 PDT 2011
On 2011-05-18 21:52, Mehrdad wrote:
> On 5/18/2011 9:22 PM, Jonathan M Davis wrote:
> > On 2011-05-18 20:55, %u wrote:
> >> Hi!
> >>
> >> Is this a bug, or is it intentional that this fails? I can't come up
> >> with any case where it would cause a problem, but the compiler doesn't
> >>
> >> like the fact that there's a const in the structure:
> >> struct Temp { const int a; int b; }
> >>
> >> auto ref foo(Temp* t) { return *t; } //Error
> >
> > As soon as you do *t, you're copying the value. As such, I don't know why
> > the ref is working at all. And it's impossible to assign to a struct
> > with a const or immutable member, so the struct is not mutable. Why
> > that's a problem here... My guess would be that it's a bug relating to
> > copying from or assigning to const. If you declare this(this), you'll
> > notice that it doesn't currently work with const, and if declared,
> > this(this) would be called upon copying the struct. Still, something
> > like
> >
> > auto t = Temp();
> > auto u = t;
> >
> > works with your definition of Temp, so just copying a non-mutable struct
> > works as long as it doesn't declare this(this). It's probably treating
> > auto ref as if it must be mutable or something like that, and Temp
> > isn't. But I don't know what the problem is exactly.
> >
> > In any case, I would definitely advise that you _not_ create structs with
> > const or immutable values, because you can never reassign to them, which
> > causes all kinds of fun problems - including making it very hard to use
> > them in arrays (_any_ place that would use Temp.init is stuck with
> > Temp.init). It's generally better to just make the variables private and
> > provide @property functions for getting the variables but not provide
> > any for setting them. That way, they're read-only and you can still
> > re-assign the whole struct if need be.
> >
> > - Jonathan M davis
>
> By the way, it doesn't matter if I use auto or not. It does the same
> thing if I say "ref Temp".
>
> Interesting notes about postblit and everything, I'll keep those in
> mind, thanks!
If I wasn't clear enough, postblit is _supposed_ to work with const but
currently doesn't. I wasn't saying that it won't ever, just that it's
currently broken.
http://d.puremagic.com/issues/show_bug.cgi?id=4867
- Jonathan M Davis
More information about the Digitalmars-d
mailing list