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.)