C++
Typ Inferenz
Suche…
Einführung
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