Is there a way to make a class variable visible but constant to outsiders, but changeable (mutable) to the class itself?

Jonathan M Davis via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 24 15:47:58 PDT 2016


On Tuesday, May 24, 2016 18:28:44 Meta via Digitalmars-d-learn wrote:
> On Tuesday, 24 May 2016 at 15:07:55 UTC, Jonathan M Davis wrote:
> > On Tuesday, May 24, 2016 10:10:16 Steven Schveighoffer via
> >
> > Digitalmars-d-learn wrote:
> >> A while ago, I discovered that this works.
> >>
> >> class C {
> >>
> >>     union
> >>     {
> >>
> >>        private int _my_var;
> >>        public const int my_var;
> >>
> >>     }
> >>     void do_something() { _my_var = 4; }
> >>
> >> }
> >
> > Yeah. That's basically what Rebindable does, though in its
> > case, it's not really allowing you to mutate any data, just
> > what the reference refers to. Regardless, it does seem like a
> > hole in the type system.
> >
> > - Jonathan M Davis
>
> I don't believe so. H. S. Teoh recently fixed a definite bug when
> you have something like:
>
> struct S
> {
>      union
>      {
>          int n1;
>          immutable int n2;
>      }
> }
>
> But I'm pretty sure the case where n2 is const was purposely not
> fixed as it doesn't break the type system. The value of a const
> variable can be changed at any time out from under you, so a
> union of a mutable and const int does not break any type system
> guarantees.

Except that int is a _value_ type, not a reference type. So, unions aside,
once you've declared

const foo = 42;

it's impossible for the value of foo to change, and there's no real
difference between

const foo = 42;

and

immutable foo = 42;

typeof(foo) will give you const in one case and immutable in the other, but
effectively, they're identical.

- Jonathan M Davis



More information about the Digitalmars-d-learn mailing list