Auto är död, länge leve auto!

Nu när vi har en verktygskedja att leka med så kan vi ta oss an den första nyheten. För att direkt visa hur offensiva man har varit i standarden så tittar vi på en nyhet som inte är bakåtkompatibel. Dvs denna ändring kan göra att gamla program slutar att fungera! Läskigt!?

Det reserverade ordet auto kommer att få en ny betydelse. Den gamla betydelsen var något som du kanske inte kommer ihåg då den i praktiken knappast användes. Det var för att det var default och kunde utelämnas vilket man alltid gjorde. Det känns kanske inte lika besvärande längre för gamla program.

Den nya betydelsen är av större intresse.  auto betyder att en variabels typ härleds från dess initialisering. Det kan vara så här enkelt:

auto i = 1;

där i får typen int.

Mer praktisk betydelse har det när initialiseringen är mer komplicerad.  Ta till exempel initialiseringen av en loopvariabel då man skall löpa igenom en standardcontainer. Loopvariabeln skall ha typen för iteratorn för containern. Det var besvärligt att skriva tidigare men det kan nu skrivas så här:

for (auto it = l.begin(); it != l.end(); ++it)
{
...;
}

Det här kan man säga är en trend inom språkutvecklingen – De typade språken försöker bli lite mindre pratiga genom att man inte behöver skriva det som kompilatorn redan vet eller kan lista ut. C++2011 hänger på den trenden. Som vi skall se senare finns det mer av den varan i den nya standarden.

Publicerad i C/C++
One comment on “Auto är död, länge leve auto!
  1. Daniel Marell skriver:

    Aha… man kan alltså byta ut raden

    for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it)
    

    mot

    for (auto it = v.begin(); it != v.end(); ++it)
    

    ..betydligt trevligare måste jag tillstå.

    Ett komplett exempel blir då:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    vector<int> createTestVector(int n) {
      vector<int> v;
      for (int i = 0; i < n; i++) {
        v.push_back(i);
      }
      return v;
    }
    
    int main() {
      vector<int> v = createTestVector(3);
      for (auto it = v.begin(); it != v.end(); ++it) {
        cout < < *it << endl;
      }
    }
    

    Åsså kompilerar vi och provkör:

    $ g++-4.5 -std=c++0x -o test1 test1.cpp 
    $ ./test1
    0
    1
    2
    

    Kul! Funkade! Det var ett tag sedan jag skrev C++.

1 Pings/Trashbacks för "Auto är död, länge leve auto!"
  1. […] än i andra språk pga den omfattande koden för att hantera iteratorer.  Vi har tidigare sett den nya användningen av auto som ett sätt att lösa detta till viss del men nu kommer något ännu […]

Kategorier

WP to LinkedIn Auto Publish Powered By : XYZScripts.com