W przypadku zmiennych określa, że typ deklarowanej zmiennej zostanie automatycznie wydedukowany z jej inicjatora. W przypadku funkcji określa, że typ zwracany jest końcowym typem zwracanym lub zostanie wydedukowany z jego instrukcji powrotu (od C ++ 14).
Składnia
auto variable initializer (1) (since C++11)
auto function -> return type (2) (since C++11)
auto function (3) (since C++14)
decltype(auto) variable initializer (4) (since C++14)
decltype(auto) function (5) (since C++14)
auto :: (6) (concepts TS)
cv(optional) auto ref(optional) parameter (7) (since C++14)
Wyjaśnienie
1) Podczas deklarowania zmiennych w zakresie blokowym, w zakresie przestrzeni nazw, w instrukcjach inicjalizacji pętli for itp. Jako specyfikatora typu można użyć słowa kluczowego auto. Po określeniu typu inicjatora kompilator określa typ, który zastąpi słowo kluczowe auto, korzystając z reguł dedukcji argumentów szablonu z wywołania funkcji (szczegółowe informacje można znaleźć w temacie dedukcja argumentów szablonu # Inne konteksty). Słowa kluczowego auto mogą towarzyszyć modyfikatory, takie jak const lub &, które będą uczestniczyć w dedukcji typu. Na przykład, biorąc pod uwagę const auto& i = expr;
, typ i jest dokładnie typem argumentu u w wyimaginowanym szablonie, template<class U> void f(const U& u)
jeśli wywołanie funkcjif(expr)
został skompilowany. W związku z tym auto && można wywnioskować jako odniesienie l-wartości lub odniesienie r-wartości zgodnie z inicjatorem, który jest używany w pętli for na podstawie zakresu. Jeśli do zadeklarowania wielu zmiennych używane jest auto, wywnioskowane typy muszą być zgodne. Na przykład deklaracja auto i = 0, d = 0.0;
jest źle sformułowana, podczas gdy deklaracja auto i = 0, *p = &i;
jest poprawnie sformułowana, a auto jest wywnioskowane jako int.
2) W deklaracji funkcji, która używa końcowej składni zwracanego typu, słowo kluczowe auto nie wykonuje automatycznego wykrywania typu. Służy tylko jako część składni.
3) W deklaracji funkcji, która nie używa końcowej składni zwracanego typu, słowo kluczowe auto wskazuje, że typ zwracany zostanie wydedukowany z argumentu operacji instrukcji return przy użyciu reguł dedukcji argumentów szablonu.
4) Jeśli zadeklarowanym typem zmiennej jest decltype (auto), słowo kluczowe auto jest zastępowane wyrażeniem (lub listą wyrażeń) jego inicjatora, a rzeczywisty typ jest wywnioskowany przy użyciu reguł dla decltype.
5) Jeśli zwracany typ funkcji jest zadeklarowany jako decltype (auto), słowo kluczowe auto jest zastępowane operandem instrukcji return, a rzeczywisty typ zwracania jest wywnioskowany przy użyciu reguł dla decltype.
6) Zagnieżdżony specyfikator nazwy w postaci auto :: jest symbolem zastępczym, który jest zastępowany klasą lub typem wyliczenia zgodnie z regułami odliczania symboli zastępczych typu ograniczonego.
7) Deklaracja parametru w wyrażeniu lambda. (od C ++ 14) Deklaracja parametru funkcji. (koncepcje TS)
Uwagi
Do C ++ 11, auto miało semantykę specyfikatora czasu przechowywania. Mieszanie zmiennych automatycznych i funkcji w jednej deklaracji, jak w, auto f() -> int, i = 0;
jest niedozwolone.
Więcej informacji: http://en.cppreference.com/w/cpp/language/auto