DIP66 - Multiple alias this
IgorStepanov via Digitalmars-d
digitalmars-d at puremagic.com
Fri Oct 10 14:15:18 PDT 2014
On Friday, 10 October 2014 at 20:47:45 UTC, Steven Schveighoffer
wrote:
> On 10/10/14 1:09 PM, IgorStepanov wrote:
>> I've created DIP for my pull request.
>> DIP: http://wiki.dlang.org/DIP66
>> PR: https://github.com/D-Programming-Language/dmd/pull/3998
>>
>> Please, comment it.
>
> This part:
>
> void test()
> {
> C c;
> int i = c; //Error: c.a.i vs c.b.i
> }
>
> static assert(is(C : int)); //Ok, because C is subtype of
> int anyway.
>
> I think might be wrong. There is a lot of code out there that
> says, e.g.:
>
> void foo(T)(T t) if(is(T : U))
> {
> U u = t;
> ...
> }
>
> Which will now create an error in the wrong place. IMO, the
> 'is' test should also fail.
>
> -Steve
I thought exactly about this using case.
See:
You have a struct like this in first place:
struct A
{
int i;
alias i this;
}
struct C
{
A a;
string s;
alias a this;
alias s this;
}
And you have a template function in second place:
void foo(T)(T t) if(is(T : int))
{
...
}
void foo(T)(T t) if(is(T : string))
{
...
}
And you have the code it third place:
C c;
foo(c); //Error: what do you mean: foo!(T : string) or foo!(T :
int)
Now, someone (A developer) changed the A definition:
struct A
{
int i;
alias i this;
}
struct B
{
int i;
alias i this;
}
struct C
{
A a;
B b;
string s;
alias a this;
alias b this;
alias s this;
}
And now, you code mystically start to works.
Attention: Infusing in one place conflict resolves conflict in
another place.
It is danger, I think.
More information about the Digitalmars-d
mailing list