Behavior of "auto"

Bill Baxter dnewsgroup at billbaxter.com
Wed Dec 5 23:48:54 PST 2007


Derek Parnell wrote:
> On Thu, 6 Dec 2007 06:20:53 +0000 (UTC), NullTerminator wrote:
> 
>> == Repost the article of NullTerminator (NullTerminator at Hotmail.com)
>> == Posted at 2007/12/06 01:07 to D
>>
>> A strange effect of using auto:
>>
>> The following code:
>> import std.stdio;
>>
>> class Test {
>>    this() {
>>       printf("Created\n");
>>    }
>>
>>    ~this() {
>>       printf("Destroyed\n");
>>    }
>> }
>>
>> int main(char[][] args){
>>    for (int n = 0; n < 10; n++)
>>       Test t = new Test();
>>    return 0;
>> }
>>
>> produces the following output:
>> Created
>> Created
>> Created
>> Created
>> Created
>> Created
>> Created
>> Created
>> Created
>> Created
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>> Destroyed
>>
>> where as changing the line:
>>       Test t = new Test();
>> to:
>>       auto Test t = new Test();
>> produces:
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>> Created
>> Destroyed
>>
>> As I understand it, one would expect this to be the effect of "scope," not
>> "auto."  Can someone explain why this happens?
> 
> Both 'scope' and 'auto' are poorly documented. However, the variable
> declared with an 'auto' is scoped to the block it is declared in and is
> destroyed when going out of scope. In effect 'auto' is shorthand for 'scope
> <type>' ...
> 
> That is to say ...
> 
>   auto t = new Test();
> 
> is equivalent to ...
> 
>   scope Test t = new Test();
>    
> 

No no no nononono!
    auto Test t = new Test();
is equivalent to
    scope Test t = new Test();

but
    auto t = new Test();
is a regular local (aka "automatic") variable who's type is deduced 
because none is explicitly specified.

The reason "auto Test t" compiles at all is because that was the syntax 
for scoped allocation before everyone and their dog complained about how 
confusing and misleading it was.    Walter changed it to 'scope' but 
unfortunately the old syntax still works for some reason.  It really 
should only work with -d set.

--bb




More information about the Digitalmars-d mailing list