Is there any reason to use the 'auto' keyword in C++03?
Note this question was originally posted in 2009, before C++11 was ratified and before the meaning of the
auto
keyword was drastically changed. The answers provided pertain only to the C++03 meaning ofauto
-- that being a storage class specified -- and not the C++11 meaning ofauto
-- that being automatic type deduction. If you are looking for advice about when to use the C++11auto
, this question is not relevant to that question.
For the longest time I thought there was no reason to use the static
keyword in C, because variables declared outside of block-scope were implicitly global. Then I discovered that declaring a variable as static
within block-scope would give it permanent duration, and declaring it outside of block-scope (in program-scope) would give it file-scope (can only be accessed in that compilation unit).
So this leaves me with only one keyword that I (maybe) don't yet fully understand: The auto
keyword. Is there some other meaning to it other than 'local variable?' Anything it does that isn't implicitly done for you wherever you may want to use it? How does an auto
variable behave in program scope? What of a static auto
variable in file-scope? Does this keyword have any purpose other than just existing for completeness?
In C++11, auto
has new meaning: it allows you to automatically deduce the type of a variable.
Why is that ever useful? Let's consider a basic example:
std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
// Do stuff here
}
The auto
there creates an iterator of type std::list<int>::iterator
.
This can make some seriously complex code much easier to read.
Another example:
int x, y;
auto f = [&]{ x += y; };
f();
f();
There, the auto
deduced the type required to store a lambda expression in a variable.
Wikipedia has good coverage on the subject.
auto
is a storage class specifier, static
, register
and extern
too. You can only use one of these four in a declaration.
Local variables (without static
) have automatic storage duration, which means they live from the start of their definition until the end of their block. Putting auto in front of them is redundant since that is the default anyway.
I don't know of any reason to use it in C++. In old C versions that have the implicit int rule, you could use it to declare a variable, like in:
int main(void) { auto i = 1; }
To make it valid syntax or disambiguate from an assignment expression in case i
is in scope. But this doesn't work in C++ anyway (you have to specify a type). Funny enough, the C++ Standard writes:
An object declared without a storage-class-specifier at block scope or declared as a function parameter has automatic storage duration by default. [Note: hence, the auto specifier is almost always redundant and not often used; one use of auto is to distinguish a declaration-statement from an expression-statement (6.8) explicitly. — end note]
which refers to the following scenario, which could be either a cast of a
to int
or the declaration of a variable a
of type int
having redundant parentheses around a
. It is always taken to be a declaration, so auto
wouldn't add anything useful here, but would for the human, instead. But then again, the human would be better off removing the redundant parentheses around a
, I would say:
int(a);
With the new meaning of auto
arriving with C++0x, I would discourage using it with C++03's meaning in code.
The auto keyword has no purpose at the moment. You're exactly right that it just restates the default storage class of a local variable, the really useful alternative being static
.
It has a brand new meaning in C++0x. That gives you some idea of just how useless it was!