On Thursday, 4 July 2013 at 15:59:21 UTC, TommiT wrote:
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);
}


Your implicit syntax is redundant. What C++ does is irrelevant. D has alias this.

import std.stdio;

struct Wrap(T)
{
    T t;
}

struct Toy
{
    alias get this;

    Wrap!Toy get()
    {
        return Wrap!Toy.init;
    }
}

void foo(T)(Wrap!T t)
{
   writeln(T.stringof);
}

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

Note, that T is Toy, so there were no type conversion during template instantiation. There was argument conversion after instantiation, as it happens usually. Back to foo function accepting slice - dmd does the same thing.

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?

See above. What type implicit converision did dmd in case of int[10] and int[]. Conversion from int to int?

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.


Example shows that implicit conversion on argument in this case has nothing with type deduction (there is no type deduction, yet argument was converted).

Reply via email to