Suche…


Einführung

In diesem Thema wird die Typinferenzierung beschrieben, die den von C ++ 11 verfügbaren Schlüsselwort auto type umfasst.

Bemerkungen

Es ist normalerweise besser, const , & und constexpr zu deklarieren, wenn Sie auto wenn unerwünschte Verhaltensweisen wie Kopieren oder Mutationen constexpr . Diese zusätzlichen Hinweise stellen sicher, dass der Compiler keine anderen Inferenzformen generiert. Es ist auch nicht ratsam, die Funktion auto überschreiben, und sollte nur verwendet werden, wenn die tatsächliche Deklaration sehr lang ist, insbesondere bei STL-Vorlagen.

Datentyp: Auto

Dieses Beispiel zeigt die grundlegenden Typinterferenzen, die der Compiler ausführen kann.

auto a = 1;        //    a = int
auto b = 2u;       //    b = unsigned int
auto c = &a;       //    c = int*
const auto  d = c; //    d = const int*
const auto& e = b; //    e = const unsigned int& 

auto x = a + b     //    x = int, #compiler warning unsigned and signed

auto v = std::vector<int>;    //    v = std::vector<int>

Das auto-Schlüsselwort führt jedoch nicht immer die erwartete Typinferenz ohne zusätzliche Hinweise für & oder const oder constexpr

//    y = unsigned int, 
//    note that y does not infer as const unsigned int&
//    The compiler would have generated a copy instead of a reference value to e or b
auto y = e;    

Lambda Auto

Der Datentyp "auto" ist eine bequeme Möglichkeit für Programmierer, Lambda-Funktionen zu deklarieren. Es hilft, indem die Anzahl der Textprogrammierer verkürzt wird, die zur Deklaration eines Funktionszeigers eingegeben werden müssen.

auto DoThis = [](int a, int b) { return a + b; };
//    Do this is of type (int)(*DoThis)(int, int)
//    else we would have to write this long
int(*pDoThis)(int, int)= [](int a, int b) { return a + b; };

auto c = Dothis(1, 2);    //    c = int
auto d = pDothis(1, 2);   //    d = int

//    using 'auto' shortens the definition for lambda functions

Wenn der Rückgabetyp von Lambda-Funktionen nicht definiert ist, wird er standardmäßig automatisch aus den Rückgabewerttypen abgeleitet.

Diese 3 sind im Grunde dasselbe

[](int a, int b) -> int  { return a + b; };
[](int a, int b) -> auto { return a + b; };
[](int a, int b) { return a + b; };

Schleifen und Auto

Dieses Beispiel zeigt, wie mit auto die Typdeklaration für for-Schleifen verkürzt werden kann

std::map<int, std::string> Map;
for (auto pair : Map)            //    pair = std::pair<int, std::string>
for (const auto pair : Map)      //    pair = const std::pair<int, std::string>    
for (const auto& pair : Map)     //    pair = const std::pair<int, std::string>&
for (auto i = 0; i < 1000; ++i)        //    i = int
for (auto i = 0; i < Map.size(); ++i)  //    Note that i = int and not size_t
for (auto i = Map.size(); i > 0; --i)  //    i = size_t


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow