Error: shadowing declaration is deprecated

Bill Baxter dnewsgroup at billbaxter.com
Sun Dec 24 15:52:12 PST 2006


jicman wrote:
> == Quote from Bill Baxter's article
>> jicman wrote:
>>> Greetings!
>>>
>>> this code,
>>>
>>>   foreach(char[] u; FPUsers)
>>>   {
>>>
>>>   }
>>>
>>> results in,
>>>

> 
> Ok, I'll buy that, but this is not working either:
> 
> char[] u;
> foreach(u; FPUsers)
> {
> }
> 
> That should work.

Ah ok, good point.  This is because foreach(u; blah) is always taken to 
mean foreach(auto u; blah).   It's a little special case to save some 
typing.  I think it's a bad idea to have such a special case, but oh 
well.  Now that you mention it I do remember ranting about this one at 
one point, but I wasn't annoyed enough by it to follow through.  For one 
it means that you can't have a loop variable in a foreach that 
'escapes', which eliminates some handy patterns like
    char[] u;
    foreach(u; FPUsers) { if match(u) break; }
    /* use u here */

Maybe there's some reason for this that has to do with how foreach is 
implemented for classes?  But I don't see how that could be the case 
when this certainly works:
    char[] u;
    foreach(utmp; FPUsers) { u=utmp; if match(u) break; }
    /* use u here */

Anyway foreach could certainly be smarter than it is.  For instance I 
believe the magic 'int' return value that opApply implementations must 
handle and diligently return back to their caller could be eliminated 
with some hidden variables on the stack.  But Walter and others here 
don't seem to see that as a wart for some reason.

--bb


More information about the Digitalmars-d-learn mailing list