Template type deduction and specialization
Steven Schveighoffer via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu May 21 06:58:16 PDT 2015
On 5/21/15 9:14 AM, Daniel Kozak wrote:
> On Thursday, 21 May 2015 at 13:12:36 UTC, Daniel Kozák wrote:
>>
>> On Thu, 21 May 2015 08:54:54 -0400
>> Steven Schveighoffer via Digitalmars-d-learn
>> <digitalmars-d-learn at puremagic.com> wrote:
>>
>>> On 5/21/15 2:35 AM, Daniel Kozák via Digitalmars-d-learn wrote:
>>> >
>>> > On Wed, 20 May 2015 17:23:05 -0700
>>> > Ali Çehreli via Digitalmars-d-learn
>>> > <digitalmars-d-learn at puremagic.com> wrote:
>>> >
>>> >> On 05/20/2015 04:10 PM, Mike Parker wrote:
>>> >>> On Wednesday, 20 May 2015 at 13:46:22 UTC, Daniel Kozák >>> wrote:
>>> >>>> DOC say `may not have` not `must not have` ;-)
>>> >>>>
>>> >>>
>>> >>> OK, if that's the intent, it needs to be reworded. As it >>> stands,
>>> >>> it looks more like it's saying specialization is not >>>
>>> permissible,
>>> >>> rather than what "might" be possible.
>>> >>
>>> >> That's the only meaning that I get: The doc means "must >> not". Yet,
>>> >> as you've shown, the behavior does not match the doc.
>>> >>
>>> >> Ali
>>> >>
>>> > 1.) we could fix just doc - easiest, but inconsistent
>>>
>>> Before doing this, we have to understand what works and what doesn't.
>>> It's not clear to me.
>>>
>>> > 2.) remove implicit deduction even for fun(T:char)(T c) and > all
>>> > other specialization - code breakage so imho not good
>>>
>>> I don't think this is possible, this would break lots of existing
>>> code.
>>>
>>> > 3.) fix doc and allow even fun(T:T*)(T* p) - same as 2
>>>
>>> I agree with this fix. I don't understand why specialization should
>>> disqualify IFTI. Can someone explain this rationale besides "because
>>> the docs say so"?
>>>
>>
>> But this will break more code than 2. So it is impossible to fix it.
>
> Not more, but it will be worst, because it could change behaviour of
> program without error message
How so? My understanding is that it's illegal to call a function with
specializations when IFTI is involved. This means code that currently
doesn't compile, will compile. But what working code base has
non-compiling code? I guess some __traits(compiles) calls would change,
but I don't see the harm in this? You can call the function with an
explicit instantiation, calling it with an implicit one isn't going to
change the semantic meaning of the call.
In other words, code that does this:
foo(x);
that doesn't compile, will start to compile as if you did:
foo!(typeof(x))(x).
How does this break code?
And how does it break more code than 2?
-Steve
More information about the Digitalmars-d-learn
mailing list