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