digitalmars.D - How does enums work?
- MicroWizard (39/39) Apr 24 2005 When I declare an enum's enclosing integral type,
- Derek Parnell (22/29) Apr 24 2005 Seems like a bug to me too. I would have thought that neither '|=' or '=...
When I declare an enum's enclosing integral type, why does try the compiler to use cast? Operators '|=' and '&=' works but a simple assign -which should be identical- does not. Have I missed something important? Tamas Nagy --------------------------------------------------------- enum TWDF:ubyte{ VALID=0x80 } class TWdp{ TWDF dataflags; public: //getter bit valid() {(dataflags&TWDF.VALID)==TWDF.VALID;} //setter void valid(bit v) { dataflags= dataflags|TWDF.VALID; //types.d(14): cannot implicitly convert expression (cast(int)(this.dataflags) //| 128) of type int to TWDF dataflags= dataflags&~TWDF.VALID; //types.d(16): cannot implicitly convert expression (cast(int)(this.dataflags) //& 127) of type int to TWDF dataflags=v?(dataflags|TWDF.VALID):(dataflags&~TWDF.VALID); //types.d(18): cannot implicitly convert expression (v ? //cast(int)(this.dataflags) | 128 : cast(int)(this.dataflags) & 127) of //type int to TWDF /* this one works if(v) { dataflags|=TWDF.VALID; } else { dataflags&=~TWDF.VALID; } */ } }
Apr 24 2005
On Sun, 24 Apr 2005 22:30:48 +0000 (UTC), MicroWizard wrote:When I declare an enum's enclosing integral type, why does try the compiler to use cast? Operators '|=' and '&=' works but a simple assign -which should be identical- does not. Have I missed something important?Seems like a bug to me too. I would have thought that neither '|=' or '=' should have worked. I'm thinking that if you have an element of an enum set modified by ORing or ANDing it with some arbitrary bit pattern, then the resulting value is not guaranteed to be a member of the same enum set anymore, and so it should fail to compile. For example, should this compile ... dataflags = 55 | TWDF.VALID; I think you should be using some other construct to acheive the effect you are after, else define two elements of the enum set and use them thus ... enum TWDF:ubyte{ VALID=0x80, INVALID=0x7F } void valid(bit v) { dataflags = (v == 1 ? TWDF.VALID : TWDF.INVALID); } -- Derek Parnell Melbourne, Australia 25/04/2005 9:17:04 AM
Apr 24 2005