Heim >Backend-Entwicklung >C#.Net-Tutorial >Die Verwendung von auto, einer neuen Funktion von C++11

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

高洛峰
高洛峰Original
2017-01-23 13:48:021605Durchsuche

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; 
}

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

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=&#39;r&#39;; // 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!

Stellungnahme:
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