Thread overview
ref barfs template parameter deduction?
May 08, 2020
NaN
May 08, 2020
NaN
May 08, 2020
Paul Backus
May 08, 2020
NaN
May 08, 2020
Ok given the following code...

auto foo(T)(T x)
{
    struct V1 { T* what; }
    V1 v;
    return v;
}

auto bam(T)(T x)
{
    struct V2 { T* what; }
    V2 v;
    return v;
}

void bar()
{
    bam(foo(1));
}


if you change the declaration of foo or bam to "ref T x", ie..

auto foo(T)(ref T x)
auto bam(T)(ref T x)

then the compiler complains thus...

ldc 1.17.0 (Editor #1, Compiler #1) D#1 with ldc 1.17.0
<source>(23): Error: template `test.foo` cannot deduce function from argument types `!()(int)`, candidates are:

<source>(7):        `test.foo(T)(ref T x)`

Compiler returned: 1

Why would ref make any difference to deciding what function to use, it even says there's only one candidate?

Cheers
May 08, 2020
On Friday, 8 May 2020 at 22:03:47 UTC, NaN wrote:
> Ok given the following code...
>
> auto foo(T)(T x)
> {
>     struct V1 { T* what; }
>     V1 v;
>     return v;
> }
>
> auto bam(T)(T x)
> {
>     struct V2 { T* what; }
>     V2 v;
>     return v;
> }
>
> void bar()
> {
>     bam(foo(1));
> }

Should have said that compiles fine when x is passed by value.
May 08, 2020
On Friday, 8 May 2020 at 22:03:47 UTC, NaN wrote:
> void bar()
> {
>     bam(foo(1));
> }
>
>
> if you change the declaration of foo or bam to "ref T x", ie..
>
> auto foo(T)(ref T x)
> auto bam(T)(ref T x)
>
> then the compiler complains thus...
>
> ldc 1.17.0 (Editor #1, Compiler #1) D#1 with ldc 1.17.0
> <source>(23): Error: template `test.foo` cannot deduce function from argument types `!()(int)`, candidates are:
>
> <source>(7):        `test.foo(T)(ref T x)`
>
> Compiler returned: 1
>
> Why would ref make any difference to deciding what function to use, it even says there's only one candidate?
>
> Cheers

The integer literal `1` is an rvalue, and can't be passed by reference.

If you explicitly instantiate the templates foo and bar in the function call, you get a more informative error message:

    bam!int(foo!int(1));

Error: function onlineapp.foo!int.foo(ref int x) is not callable using argument types (int)
       cannot pass rvalue argument 1 of type int to parameter ref int x
May 08, 2020
On Friday, 8 May 2020 at 22:11:57 UTC, Paul Backus wrote:
> On Friday, 8 May 2020 at 22:03:47 UTC, NaN wrote:
>
> The integer literal `1` is an rvalue, and can't be passed by reference.
>
> If you explicitly instantiate the templates foo and bar in the function call, you get a more informative error message:
>
>     bam!int(foo!int(1));
>
> Error: function onlineapp.foo!int.foo(ref int x) is not callable using argument types (int)
>        cannot pass rvalue argument 1 of type int to parameter ref int x

Ooops facepalm!

Thanks :)