"<Type> is not mutable" when using ref return type
Jonathan M Davis
jmdavisProg at gmx.com
Wed May 18 21:22:42 PDT 2011
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
More information about the Digitalmars-d
mailing list