UFCS with constructors

Ali Çehreli acehreli at yahoo.com
Wed Nov 6 09:10:34 PST 2013


On 11/06/2013 03:04 AM, bearophile wrote:
> import std.typecons: Typedef;
> alias Foo = Typedef!double;
> void main() {
>      auto a1 = Foo(1);
>      pragma(msg, typeof(a1));
>      auto a2 = 1.Foo;
>      pragma(msg, typeof(a2));
>      auto a3 = Foo(-1);
>      pragma(msg, typeof(a3));
>      auto a4 = -1.Foo;
>      pragma(msg, typeof(a4));
> }
>
>
> It prints:
>
> Typedef!(double, nan)
> Typedef!(double, nan)
> Typedef!(double, nan)
> double
>
>
> Is this expected/acceptable/good?
>
> Bye,
> bearophile

I would be very surprised if unary "-" produced a different type from 
the operand:

import std.typecons: Typedef;

alias Foo = Typedef!double;

void main() {
     auto a = 1.Foo;
     auto b = -a;
     static assert (is (typeof(a) == typeof(b)));    // FAILS!
}

After all, we are used to hidden bugs based on that expectation: ;)

void main()
{
     uint a = 1;
     auto b = -a;

     assert(b == uint.max);                  // WT?
     static assert(is (typeof(b) == uint));  // <-- the reason
}

Seriously though, yeah, unary "-" must return Typedef!(double, nan).

Ali



More information about the Digitalmars-d-learn mailing list