Function templates do implicit conversions for their arguments

TommiT tommitissari at hotmail.com
Thu Jul 4 08:59:19 PDT 2013


On Thursday, 4 July 2013 at 15:03:54 UTC, Maxim Fomin wrote:
> [..]
> 2) In case of one parameter, a variable isn't tied to any type 
> and usual implicit conversions are applied.

Do you mean that if D had the C++ style implicit conversion 
operator (using let's say the keyword '@implicit'), then the 
following would compile?

struct Wrap(T)
{
     T t;
}

struct Toy
{
     alias Wrapped = Wrap!Toy;

     @implicit Wrapped opCast(T : Wrapped)()
     {
         return Wrapped.init;
     }
}

void foo(T)(Wrap!T) { }

void main()
{
     foo(Toy.init);
}


On Thursday, 4 July 2013 at 15:03:54 UTC, Maxim Fomin wrote:
> On Thursday, 4 July 2013 at 13:55:17 UTC, TommiT wrote:
>> On Thursday, 4 July 2013 at 13:45:07 UTC, Maxim Fomin wrote:
>>> Actually if you pass integer static array, dmd deduces T to 
>>> be int, [..]
>>
>> And that right there, "dmd deduces T to be int", is the crux 
>> of the matter. How on earth is DMD able to deduce T to be int, 
>> without using the implicit conversion from int[10] to int[] ?
>
> DMD is stupid, but not that. If it has T[] parameter, and 
> int[10] static array which is convertible to int[] is passed, T 
> is deduced to be int. What other types T can be? A float, 
> object, or pointer to union?

So you admit that DMD does implicit conversion during type 
deduction?


On Thursday, 4 July 2013 at 15:03:54 UTC, Maxim Fomin wrote:
> On Thursday, 4 July 2013 at 13:55:17 UTC, TommiT wrote:
>> DMD does the implicit conversion int[10] -> int[] while it is 
>> doing type deduction, which according to TDPL shouldn't happen.
>
> This is flawed since you can:
>
> int[10] arr;
> foo!int(arr).

What exactly in what I said there is flawed? Your example 
foo!int(arr) has nothing to do with what I said, because there's 
no type deduction in your example.


On Thursday, 4 July 2013 at 15:03:54 UTC, Maxim Fomin wrote:
> [..] And if you argue, that this should not happen, than you 
> argue to make explicit "!int" typing which is absolutely 
> redundant in this case.

What on earth made you think that I would argue for such idiocy.


More information about the Digitalmars-d mailing list