Die Verwendung von auto, einer neuen Funktion von C++11

高洛峰
Freigeben: 2017-01-23 13:48:02
Original
1568 Leute haben es durchsucht

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 = &#39;A&#39;; 
 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; 
}
Nach dem Login kopieren

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&#39;s type is double
Nach dem Login kopieren

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;
Nach dem Login kopieren

2. Mit auto deklarierte Variablen müssen initialisiert werden

auto m; // m should be intialized
Nach dem Login kopieren

3. Auto kann nicht in Kombination mit anderen Typen verwendet werden

auto int p; // 这是旧auto的做法。
Nach dem Login kopieren

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){}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

7. In einer automatischen Sequenz definierte Variablen müssen immer auf denselben Typ abgeleitet werden

auto x1 = 5, x2 = 5.0, x3=&#39;r&#39;; // This is too much....we cannot combine like this
Nach dem Login kopieren

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
Nach dem Login kopieren

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]
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage