digitalmars.D.learn - opIs broke for structs?
- Era Scarecrow (19/19) Oct 13 2012 I'm curious why this would break and not work, as is should
- H. S. Teoh (9/13) Oct 13 2012 [...]
- bearophile (10/14) Oct 13 2012 "is" is meant to perform a bitwise comparison (I think today it
- Era Scarecrow (19/31) Oct 13 2012 Sure there is, it's just not one you can override to my
I'm curious why this would break and not work, as is should compare against it's location/entity correct? I wonder why it breaks then for structs on the stack. I can only find 'opIs missing' when searching for it, so... struct X { int x; } class Y { int y; } Y y1 = new Y(); Y y2 = new Y(); X x1, x2; assert(y1.y == y2.y); assert(y1 !is y2); assert(y1 != y2); //same as !is by default as i recall // writefln("x1 = 0x%s\nx2 = 0x%s", &x1, &x2); assert(x1 == x2); assert(x1 !is x2); //fails
Oct 13 2012
On Sat, Oct 13, 2012 at 11:40:04PM +0200, Era Scarecrow wrote:I'm curious why this would break and not work, as is should compare against it's location/entity correct? I wonder why it breaks then for structs on the stack. I can only find 'opIs missing' when searching for it, so...[...] Wait, there's such a thing as overloading 'is'? If there is, that's pretty messed up. The 'is' operator is used for a lot of fundamental stuff, and allowing structs and classes to change that just sounds ... wrong. T -- It's amazing how careful choice of punctuation can leave you hanging:
Oct 13 2012
Era Scarecrow:I'm curious why this would break and not work, as is should compare against it's location/entity correct? I wonder why it breaks then for structs on the stack. I can only find 'opIs missing' when searching for it, so..."is" is meant to perform a bitwise comparison (I think today it is working as designed or it's very close to this target). So on class references "is" performs a bitwise comparison of the references themselves. On values (like structs) "is" compares the struct values bit-wise. In your code x1 and x2 contain the same bit patterns (32 bits set to zero), so "x1 is x2" is true. Bye, bearophile
Oct 13 2012
On Saturday, 13 October 2012 at 22:19:44 UTC, H. S. Teoh wrote:Wait, there's such a thing as overloading 'is'? If there is, that's pretty messed up. The 'is' operator is used for a lot of fundamental stuff, and allowing structs and classes to change that just sounds ... wrong.Sure there is, it's just not one you can override to my knowledge (along with in (AA & array) I believe). I only referred to it as opIs since that's likely how internally the compiler deals with it, plus there's a reference to opIs in 2008. On Saturday, 13 October 2012 at 22:42:35 UTC, bearophile wrote:"is" is meant to perform a bitwise comparison (I think today it is working as designed or it's very close to this target).So on class references "is" performs a bitwise comparison of the references themselves.On values (like structs) "is" compares the struct values bit-wise. In your code x1 and x2 contain the same bit patterns (32 bits set to zero), so "x1 is x2" is true.TDPL pg. 57 [quote] The expression a is b compares for alias equality and returns true if a and be refer to the same actual object. * If a and b are arrays or class references, the result is true if and only if a and b are two named for the same actual object. * Otherwise, a is b is the same as a == b [/quote] Hmm I had more the impression it was address space only. But if it's in the manual and spec, then I'm wrong and just needed a refresher on it. Course if structs are relocatable and are identical, they are as good as the same object. So *shrugs* Sorry for bringing it up then.
Oct 13 2012