J'apprends le C++ maintenant parce que j'ai besoin d'écrire des programmes de bas niveau.
Lorsque j'ai découvert le mot clé "auto", cela me rappelle le mot clé "var", en C #.
Alors, quelles sont les différences de C # "var" et C++ "auto"?
En C # var, le mot clé ne fonctionne que localement à l'intérieur de la fonction:
var i = 10; // implicitly typed
Dans le mot clé automatique C++ peut en déduire tapez non seulement dans les variables, mais aussi dans les fonctions et les modèles:
auto i = 10;
auto foo() { //deduced to be int
return 5;
}
template<typename T, typename U>
auto add(T t, U u) {
return t + u;
}
Du point de vue des performances, le mot clé auto en C++ n'affecte pas les performances . Et le mot-clé var n'affecte pas non plus les performances .
Une autre différence peut être dans le support intellisense dans IDE. Le mot-clé Var en C # peut être facilement déduit et vous verrez le type avec la souris sur. Avec le mot-clé auto en C++, cela pourrait être plus compliqué, cela dépend de l'IDE.
Pour faire simple, auto
est une bête beaucoup plus compliquée que var
.
Premièrement, auto
ne peut faire partie que du type déduit; par exemple:
std::vector<X> xs;
// Fill xs
for (auto x : xs) x.modify(); // modifies the local copy of object contained in xs
for (auto& x : xs) x.modify(); // modifies the object contained in xs
for (auto const& x : xs) x.modify(); // Error: x is const ref
Deuxièmement, auto
peut être utilisé pour déclarer plusieurs objets à la fois:
int f();
int* g();
auto i = f(), *pi = g();
Troisièmement, auto
est utilisé dans le cadre de la syntaxe du type de retour de fin dans les déclarations de fonction:
template <class T, class U>
auto add(T t, U u) -> decltype(t + u);
Il peut également être utilisé pour la déduction de type dans les définitions de fonction:
template <class T, class U>
auto add(T t, U u) { return t + u; }
Quatrièmement, à l'avenir, il pourrait commencer à être utilisé pour déclarer des modèles de fonction:
void f(auto (auto::*mf)(auto));
// Same as:
template<typename T, typename U, typename V> void f(T (U::*mf)(V));
Ils sont équivalents. Ils vous permettent tous les deux de ne pas spécifier vous-même le type d'une variable, mais la variable reste fortement typée. Les lignes suivantes sont équivalentes en c #:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
Et les lignes suivantes sont équivalentes en c ++:
auto i = 10;
int i = 10;
Cependant, vous devez garder à l'esprit qu'en c ++ le type correct d'une variable auto
est déterminé en utilisant les règles de déduction des arguments de modèle pour un appel de fonction.