So why double to float conversion is implicit ?

Basile B. b2.temp at gmx.com
Sun Oct 22 12:17:49 UTC 2017


On Sunday, 22 October 2017 at 10:57:24 UTC, NX wrote:
> On Sunday, 22 October 2017 at 02:25:44 UTC, codephantom wrote:
>> On Saturday, 21 October 2017 at 20:17:12 UTC, NX wrote:
>>> Interestingly enough, I realized that atan() returns double 
>>> (in this case) but wait, it's assigned to a float variable! 
>>> Compiler didn't even emit warnings, let alone errors.
>>>
>>
>> There a few lessons here.
>>
>> (1) D is not Java ;-)
>
> D is not C/C++ either. I fail to see how does it help to be C++ 
> compliant. It's absolutely trivial to tell the compiler that 
> conversion is on purpose by explicitly casting and it immensely 
> helps to reduce bugs (since we are humans after all).
>
>> (2) Know what types are being returned from your calls, before 
>> you call them.
>> (3) Know what the language spec says about conversions (and 
>> their order):
>>     - https://dlang.org/spec/type.html
>> (4) If unsure, test it:
>>     - 
>> https://dlang.org/phobos/std_traits.html#isImplicitlyConvertible
>>
>> Only then should you start coding ;-)
>
> It never crossed my mind that D would allow such type 
> conversion since I don't recall any language that markets 
> itself as _modern_ allows it.
>
>> oh...and...
>>
>> (5) Don't waste time arguing with the spec ;-)
>> (6) Don't expect the compiler to not comply with the spec
>
> I just think spec should be reviewed at this point.

Fortunately D provides enough to simplify self-discipline:

---
import std.traits;

struct FP(T)
if (isFloatingPoint!T)
{
     T _value;
     alias _value this;

     void antiCoercion(V)()
     {
         static assert(V.sizeof <= T.sizeof, "C++ float coercion 
is not allowed");
     }

     this(V)(V v) {antiCoercion!V; _value = v;}
     void opAssign(V)(V v) {antiCoercion!V; _value = v;}
}

void main()
{
     import std.math;
     FP!single PiOver2 = (atan(1.0) * 4) / 2;
}
---


More information about the Digitalmars-d mailing list