ushort calls byte overload

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 30 14:42:03 PDT 2017



Dne 30.5.2017 v 23:16 Oleg B via Digitalmars-d-learn napsal(a):
> Hello. I have this code
>
> import std.stdio;
>
> void foo(byte a) { writeln(typeof(a).stringof); }
> void foo(short a) { writeln(typeof(a).stringof); }
> void foo(int a) { writeln(typeof(a).stringof); }
>
> void main()
> {
>     foo(0); // int, and byte if not define foo(int)
>     foo(ushort(0)); // byte (unexpected for me)
>     foo(cast(ushort)0); // byte (unexpected too)
>
>     foo(cast(short)0); // short
>     foo(short(0)); // short
>
>     ushort x = 0;
>     foo(x); // short
> }
>
> Is this a bug or I don't understand something?

It is "not" a bug, and it is how compiler works. Compiler do many 
assumptions (it is sometimes useful). So if it see something like
immutable ushort y = 0 (compile time value) or just "0" (still compile 
time value) it knows its value so it knows it can be saftly represent in 
byte, ubyte and so on.

However ushort x = 0;
foo(x); // here x is runtime value so compilere does not know the size, 
so it will use the type.

Lets look to an another example

immutable ushort y = 0;
byte x = y;

this will compile because of current rules.

but this:

ushort y = 0;
byte x = y;

will produce this error: Error: cannot implicitly convert expression (y) 
of type ushort to byte

And in this example is everything ok:

import std.stdio;

void f(ushort u)
{
     writeln("ushort");
}

void f(ubyte u)
{
     writeln("ubyte");
}

void main()
{
     ushort y = 0;
     immutable ushort x = 0;

     f(y);
     f(x);
}

RESULT IS:
ushort
ushort

but obviously in follow example it could be misleading

import std.stdio;

void f(short u)
{
     writeln("short");
}

void f(ubyte u) // or byte u
{
     writeln("ubyte or byte");
}

void main()
{
     ushort y = 0;
     immutable ushort x = 0;

     f(y);
     f(x);
}

RESULT IS:
ushort
[u]byte

But it make sense, compiler will select the best match in this case it 
is byte or ubyte but if we change x to something like 128
wi will get different results for byte and ubyte




More information about the Digitalmars-d-learn mailing list