On Friday, 17 April 2020 at 21:25:34 UTC, kdevel wrote:
On Friday, 17 April 2020 at 12:59:20 UTC, Simen Kjærås wrote:
A curiosity. Usually you cast into the type on the left. But

   Checked!(short, Throw) b = cast (Checked!(short, Throw)) a;

does not compile:

   Error: template std.experimental.checkedint.Checked!(int,
Throw).Checked.opCast cannot deduce function from argument types
   !(Checked!(short, Throw))(), candidates are: [...]

One has to go over the underlying type?

The author of std.experimental.checkedint hasn't implemented the overload of opCast required to make your code work. It's just a missing feature.

The above code will throw when casting (before the assignment), because 65535 can't fit in a short.

It's remarkable that the cast to the /underlying type/ throws. I would have expected that

   cast(short) a

is equivalent to what actually must be written as

   cast(short) a.get

You also get a deprecation message, about an integral promotion not being performed. I believe the result is correct and the warning can be ignored.

So the warning is a bug?

The warning is caused by some (very annoying, but intentional) changes made to the compiler after std.experimental.checkedint was written. That module needs to be updated accordingly, but no one has done it yet.

Anyway, you might want to take a look at my checkedint package on Dub:

    https://code.dlang.org/packages/checkedint

In my opinion, the API is better - especially if you use SmartInt. (I submitted it for inclusion in the standard library originally, but Alexandrescu did not agree with my approach and so wrote his own version, which became std.experimental.checkedint.)

Reply via email to