Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The new keyword "auto"; When should it be used to declare a variable type? [duplicate]

Possible Duplicate:
How much is too much with C++0x auto keyword

Have we (as a community) had enough experience to determine when and/or whether auto is being abused?

What I am really looking for is a best practices guide on

  • when to use auto
  • when it should be avoided

Simple rules of thumb that can quickly be followed in 80% of cases.

As a context this question is sparked by my response here

like image 302
Martin York Avatar asked Aug 01 '11 15:08

Martin York


People also ask

When should I use Auto?

The auto keyword is a simple way to declare a variable that has a complicated type. For example, you can use auto to declare a variable where the initialization expression involves templates, pointers to functions, or pointers to members.

What is the use of auto keyword in C++?

The auto keyword specifies that the type of the variable that is begin declared will automatically be deduced from its initializer and for functions if their return type is auto then that will be evaluated by return type expression at runtime.

Is it OK to use auto in C++?

Automatic type deduction is one of the most important and widely used features in modern C++. The new C++ standards have made it possible to use auto as a placeholder for types in various contexts and let the compiler deduce the actual type.

What can we use instead of auto in C++?

auto is a C++11 feature that deduces the type of the variable (at compile-time). In this instance, it deduces auto to be an int, so i is a reference to an int. Your code would behave exactly the same if you replaced "auto" with "int".


Video Answer


1 Answers

I think when the type is very well-known amongst the co-programmers who work (or would work) in your project, then auto can be used, such as in the following code:

//good : auto increases readability here for(auto it = v.begin(); it != v.end(); ++it) //v is some [std] container {       //.. } 

Or, more generally,

//good : auto increases readability here for(auto it = std::begin(v); it != std::end(v); ++it)//v could be array as well {       //.. } 

But when the type is not very well-known and infrequently used , then I think auto seems to reduce readability, such as here:

//bad : auto decreases readability here auto obj = ProcessData(someVariables); 

While in the former case, the usage of auto seems very good and doesn't reduce readability, and therefore, can be used extensively, but in the latter case, it reduces readabilty and hence shouldn't be used.


Another place where auto can be used is when you use new1 or make_* functions , such as here:

//without auto. Not that good, looks cumbersome SomeType<OtherType>::SomeOtherType * obj1 = new SomeType<OtherType>::SomeOtherType(); std::shared_ptr<XyzType> obj2 = std::make_shared<XyzType>(args...); std::unique_ptr<XyzType> obj2 = std::make_unique<XyzType>(args...);  //With auto. good : auto increases readability here auto obj1 = new SomeType<OtherType>::SomeOtherType(); auto obj2 = std::make_shared<XyzType>(args...); auto obj3 = std::make_unique<XyzType>(args...); 

Here it is very good, as it reduces the use of keyboard, without reducing the readability, as anyone can know the type of objects being created, just by looking at the code.

1. Avoid using new and raw-pointers though.


Sometime, the type is so irrelevant that the knowledge of the type is not even needed, such as in expression template; in fact, practically it is impossible to write the type (correctly), in such cases auto is a relief for programmers. I've written expression template library which can be used as:

foam::composition::expression<int> x;  auto s = x * x;       //square auto c = x * x * x;   //cube for(int i = 0; i < 5 ; i++ )     std::cout << s(i) << ", " << c(i) << std::endl;  

Output:

0, 0 1, 1 4, 8 9, 27 16, 64 

Now compare the above code with the following equivalent code which doesn't use auto:

foam::composition::expression<int> x;  //scroll horizontally to see the complete type!! foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<int>, foam::composition::expression<int>, foam::operators::multiply>> s = x * x; //square foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<int>, foam::composition::expression<int>, foam::operators::multiply> >, foam::composition::expression<int>, foam::operators::multiply>> c = x * x * x; //cube  for(int i = 0; i < 5 ; i++ )     std::cout << s(i) << ", " << c(i) << std::endl;  

As you can see, in such cases auto makes your life exponentially easier. The expressions used above are very simple; think about the type of some more complex expressions:

auto a = x * x - 4 * x + 4;  auto b = x * (x + 10) / ( x * x+ 12 ); auto c = (x ^ 4 + x ^ 3 + x ^ 2 + x + 100 ) / ( x ^ 2 + 10 ); 

The type of such expressions would be even more huge and ugly, but thanks to auto, we now can let the compiler infer the type of the expressions.


So the bottomline is: the keyword auto might increase or decrease clarity and readability of your code, depending on the context. If the context makes it clear what type it is, or at least how it should be used (in case of standard container iterator) or the knowledge of the actual type is not even needed (such as in expression templates), then auto should be used, and if the context doesn't make it clear and isn't very common (such as the second case above), then it should better be avoided.

like image 194
Nawaz Avatar answered Sep 26 '22 04:09

Nawaz