Comment #0 by bearophile_hugs — 2010-03-12T14:57:54Z
This is a wrong D2 program:
immutable class Foo {}
class Bar : Foo { int x; }
void main() {
auto b = new Bar;
b.x = 10; // line 5
}
From the error message it's clear that x is not a mutable variable:
test.d(5): Error: can only initialize const member x inside constructor
But from the code of the Foo class there is no clear indication that x is immutable. So in this situation I think it's better if the compiler requires a immutable annotation on x too, for code readability, something like:
immutable class Foo {}
class Bar : Foo { int x; } // Error: attribute x requires 'immutable' annotation
void main() {
auto b = new Bar;
}
immutable class Foo {}
class Bar : Foo { immutable int x; } // OK, no error
void main() {
auto b = new Bar;
}
Comment #1 by tjverweij — 2010-07-07T14:36:34Z
Here's another situation that produces the same error message:
class Foo
{
int x;
immutable void bar() { x = 1; }
}
Error: can only initialize const member x inside constructor
It should probably report something along the lines of "immutable member function cannot modify member variables".
Comment #2 by robert.schadek — 2024-12-13T17:51:36Z