Vorwort
C++ ist eine stark typisierte Sprache. Bei der Deklaration einer Variablen muss ihr Typ klar angegeben werden. In der Praxis ist es jedoch schwierig, auf den Typ des Werts eines Ausdrucks zu schließen. Insbesondere mit dem Aufkommen von Vorlagentypen wird es schwieriger, den Rückgabetyp einiger komplexer Ausdrücke herauszufinden. Um dieses Problem zu lösen, hat die in C++ 11 eingeführte automatische Funktion zwei Hauptverwendungszwecke: automatische Typinferenz und Rückgabewertbelegung. Die Semantik von auto in C++98 zur Identifizierung temporärer Variablen wurde in C++11 aufgrund ihrer minimalen und redundanten Verwendung entfernt. Die beiden Standardautos davor und danach sind völlig unterschiedliche Konzepte.
1. Automatische Typinferenz
Die automatische Typinferenz wird verwendet, um den Datentyp der Variablen aus dem Initialisierungsausdruck abzuleiten. Durch die automatische Typinferenz von auto kann unsere Programmierarbeit erheblich vereinfacht werden. Hier sind einige Beispiele für die Verwendung von Auto.
#include <vector> #include <map> using namespace std; int main(int argc, char *argv[], char *env[]) { // auto a; // 错误,没有初始化表达式,无法推断出a的类型 // auto int a = 10; // 错误,auto临时变量的语义在C++11中已不存在, 这是旧标准的用法。 // 1. 自动帮助推导类型 auto a = 10; auto c = 'A'; auto s("hello"); // 2. 类型冗长 map<int, map<int,int> > map_; map<int, map<int,int>>::const_iterator itr1 = map_.begin(); const auto itr2 = map_.begin(); auto ptr = []() { std::cout << "hello world" << std::endl; }; return 0; }; // 3. 使用模板技术时,如果某个变量的类型依赖于模板参数, // 不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。 template <class T, class U> void Multiply(T t, U u) { auto v = t * u; }
2. Rückgabewertbelegung
template <typename T1, typename T2> auto compose(T1 t1, T2 t2) -> decltype(t1 + t2) { return t1+t2; } auto v = compose(2, 3.14); // v's type is double
3. Vorsichtsmaßnahmen für die Verwendung
1 Wir können flüchtige Zeiger (*) als Referenz verwenden (&), R-Wert-Referenz (&&) zum Ändern von Auto
auto k = 5; auto* pK = new auto(k); auto** ppK = new auto(&k); const auto n = 6;
2. Mit auto deklarierte Variablen müssen initialisiert werden
auto m; // m should be intialized
3. Auto kann nicht in Kombination mit anderen Typen verwendet werden
auto int p; // 这是旧auto的做法。
4 Parameter können nicht als Auto deklariert werden
void MyFunction(auto parameter){} // no auto as method argument template<auto T> // utter nonsense - not allowed void Fun(T t){}
5. Auf dem Heap definierte Variablen, Ausdrücke, die Auto verwenden, müssen initialisiert werden
int* p = new auto(0); //fine int* pp = new auto(); // should be initialized auto x = new auto(); // Hmmm ... no intializer auto* y = new auto(9); // Fine. Here y is a int* auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)
6. Ich denke, auto ist ein Platzhalter, kein eigener Typ, daher kann es nicht für Typkonvertierung oder andere Operationen wie sizeof und typeid verwendet werden
int value = 123; auto x2 = (auto)value; // no casting using auto auto x3 = static_cast<auto>(value); // same as above
7. In einer automatischen Sequenz definierte Variablen müssen immer auf denselben Typ abgeleitet werden
auto x1 = 5, x2 = 5.0, x3='r'; // This is too much....we cannot combine like this
8. auto kann nicht automatisch in CV-Qualifizierer (konstante und volatile Qualifizierer) abgeleitet werden, es sei denn, es wird als Referenztyp deklariert
const int i = 99; auto j = i; // j is int, rather than const int j = 100 // Fine. As j is not constant // Now let us try to have reference auto& k = i; // Now k is const int& k = 100; // Error. k is constant // Similarly with volatile qualifer
9 , auto degeneriert zu einem Zeiger auf ein Array, sofern es nicht als Referenz deklariert wird
int a[9]; auto j = a; cout<<typeid(j).name()<<endl; // This will print int* auto& k = a; cout<<typeid(k).name()<<endl; // This will print int [9]
Zusammenfassung
Das Obige ist der gesamte Inhalt dieses Artikels, das hoffe ich Der Inhalt des Artikels kann für alle beim Erlernen oder Verwenden von C++ hilfreich sein. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation hinterlassen.
Weitere Artikel zur Verwendung von Auto, der neuen Funktion von C++11, finden Sie auf der chinesischen PHP-Website!