On 14/05/2012 18:08, Tove wrote:
<snip>
class Outer
{
  int i = 6; // mutable

  class Inner {
    int y=0;

    int foo() const
    {
      // ++y; // fail
      return ++i; // look ma, mutable const
    }
  }
  Inner inner;
  this()
  {
    inner = new Inner;
  }
  alias inner this;
}

Indeed, you've found a hole in the const system nobody seems to have noticed 
before!

Inner.foo is const, so from foo's point of view, Inner.outer needs to be.

To expand your example a bit:
----------
import std.stdio;

class Outer {
    int i = 6;

    class Inner {
        int y=0;

        int foo() const {
            pragma(msg, "this.outer: " ~ typeof(this.outer).stringof);
            pragma(msg, "i:          " ~ typeof(i).stringof);
            return ++i;
        }
    }
    Inner inner;
    this() {
        inner = new Inner;
    }
}

void main() {
    const(Outer) x = new Outer;
    pragma(msg, "x:          " ~ typeof(x).stringof);
    pragma(msg, "x.inner:    " ~ typeof(x.inner).stringof);
    x.inner.foo();
    writeln(x.i);
}
----------
C:\Users\Stewart\Documents\Programming\D\Tests>dmd inner_const.d
this.outer: const(Outer)
i:          const(int)
x:          const(Outer)
x.inner:    const(Inner)
----------

but nonetheless, it allows i to be modified!

http://d.puremagic.com/issues/show_bug.cgi?id=8098

Stewart.

Reply via email to