Préface
Le C est un langage fortement typé, et le type d'une variable doit être clairement indiqué lors de sa déclaration. Cependant, en pratique, il est difficile de déduire le type de valeur d'une expression. Surtout avec l'émergence des types de modèles, il devient plus difficile de déterminer le type de retour de certaines expressions complexes. Pour résoudre ce problème, auto introduit dans C 11 a deux utilisations principales : l'inférence de type automatique et l'occupation de la valeur de retour. La sémantique de auto en C98 pour identifier les variables temporaires, rarement utilisées et redondantes, a été supprimée en C++11. Les deux automobiles standards avant et après sont des concepts complètement différents.
1. Inférence de type automatique
L'inférence de type automatique est utilisée pour déduire le type de données de la variable à partir de l'expression d'initialisation. Grâce à l'inférence de type automatique d'auto, notre travail de programmation peut être considérablement simplifié. Voici quelques exemples d’utilisation de 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. Valeur de retour d'occupation
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. Précautions d'utilisation
1. On peut utiliser volatile, pointeur (*), référence. (&), référence rvalue (&&) pour modifier auto
auto k = 5; auto* pK = new auto(k); auto** ppK = new auto(&k); const auto n = 6;
2 Les variables déclarées avec auto doivent être initialisées
auto m; // m should be intialized
auto int p; // 这是旧auto的做法。
void MyFunction(auto parameter){} // no auto as method argument template<auto T> // utter nonsense - not allowed void Fun(T t){}
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)
int value = 123; auto x2 = (auto)value; // no casting using auto auto x3 = static_cast<auto>(value); // same as above
auto x1 = 5, x2 = 5.0, x3='r'; // This is too much....we cannot combine like this
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
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]