Class/struct invariants
Steven Schveighoffer
schveiguy at yahoo.com
Wed Jun 16 04:00:13 PDT 2010
On Tue, 15 Jun 2010 21:29:27 -0400, bearophile <bearophileHUGS at lycos.com>
wrote:
> Are D invariants supposed to be so "relaxed"? They don't get called with
> default constructors:
>
>
> struct Foo {
> int x = 0;
> this(int xx) { this.x = xx; }
> invariant() { assert(x == 1); }
> }
> struct Bar {
> int x = 0;
> invariant() { assert(x == 1); }
> }
> class CFoo {
> int x = 0;
> this(int xx) { this.x = xx; }
> invariant() { assert(x == 1); }
> }
> class CBar {
> int x = 0;
> invariant() { assert(x == 1); }
> }
> void main() {
> Foo f1; // no asserts
> Foo f2 = Foo(); // no asserts
> // Foo f3 = Foo(0); // asserts, good
>
> Bar b1; // no asserts
> Bar b2 = Bar(); // no asserts
> Bar b3 = Bar(0); // no asserts
>
> //assert(b3); // can't be used
> // b3.__invariant(); // asserts
>
> //CFoo f3 = new CFoo(0); // asserts, good
>
> CBar cb2 = new CBar(); // no asserts
> //assert(cb2); // asserts, good
> }
Default construction for structs is a weird animal in D. A struct can
always be default constructed and is always initialized to s.init. This
allows you to construct for instance an array of structs with simple
memory copying.
During default struct construction, no constructors are run (they aren't
allowed anyways) and no invariants are run. What would be the point of
running an invariant during default construction? The only think it could
possibly do is make code like this:
S s;
Fail without -release, and pass with -release. I don't see the value in
that.
-Steve
More information about the Digitalmars-d-learn
mailing list