Why code failed to compile for foo2?
Stanislav Blinov
stanislav.blinov at gmail.com
Sat Dec 11 23:17:17 UTC 2021
On Saturday, 11 December 2021 at 22:59:52 UTC, Adam Ruppe wrote:
> On Saturday, 11 December 2021 at 22:50:45 UTC, apz28 wrote:
>> void foo2(T)(Unqual!T x) if(isUnsigned!T) {}
>
> This means it treats foo2 as if it doesn't exist unless T is
> unsigned...
>
>> onlineapp.d(15): Error: template `onlineapp.foo2` cannot
>> deduce function from argument types `!()(int)`
>> onlineapp.d(7): Candidate is: `foo2(T)(Unqual!T x)`
>> */
>
> And this is telling you it had a signed value - int - which
> means it doesn't match.
>
> For the other ones, the functions still exist, so it does
> whatever conversion it needs. Whereas with the template that
> constraint means the compiler acts like it doesn't exist at all
> and thus doesn't even attempt an automatic conversion.
? No. If it was unsatisfied constraint, the error would've shown
that. What's going on here is that the argument being passed is
an int, when the parameter is an Unqual!T. So,
https://dlang.org/spec/template.html#ifti would fail because
there is no way of figuring out a T from an Unqual!T. Hence the
message: cannot deduce function.
More information about the Digitalmars-d-learn
mailing list