On Saturday 12 September 2015 18:08, Robert wrote: > It's unusual, because `float.nan != float.nan`, so one might > expect that `typeof(Foo!(float.nan) != Foo!(float.nan))`, whereas > this is clearly not the case, even with both the static assert > and runtime assert failing. I'm just curious to understand the > reasoning behind this, whether it's intentional, and whether it > matters at all.
I don't know what the compiler actually does, but it looks like the comparison of template value arguments doesn't use equality, but something more akin to `is` instead (bitwise equality). If that's right, then `is(Foo!(float.nan) == Foo!(float.nan))` holds because `float.nan is float.nan` holds. Same behavior with a struct instead of float: ---- struct S { bool opEquals(S other) {return false;} } struct Foo(S s) { } static assert(S.init != S.init); /* not equal */ static assert(S.init is S.init); /* but bit for bit identical */ static assert(is(Foo!(S.init) == Foo!(S.init))); ----