Sdílet prostřednictvím


Automatické klíčové slovo (typ srážky)

Deduces typ deklarované proměnné z jeho inicializace výrazu.

auto declarator initializer;

Poznámky

auto Klíčové slovo směruje kompilátor používal výraz inicializace deklarované proměnné odvodit jeho typu.

[!POZNÁMKA]

Před Visual C++ 2010, auto specifikátor pro automatické třídy úložiště byl klíčové slovo.Využití je nyní chybu./Zc:auto Možnost kompilátoru, který je ve výchozím nastavení, instruuje kompilátor, aby pomocí nových smyslu auto klíčové slovo.

Doporučujeme používat auto klíčové slovo pro většinu situací – Pokud chcete převod, protože poskytuje následující výhody:

  • Odolnosti: Pokud se změní výraz typu – jedná se o při změně návratový typ funkce – právě pracuje.

  • Výkon: je zaručeno, že bude bez převodu.

  • Použitelnost: nemusíte obávat, že obtíže pravopis názvu typu a překlepy.

  • Účinnost: kódování může být efektivnější.

Převod případy, ve kterých není vhodné používat auto:

  • Pokud chcete určitý typ a nic jiného udělá.

  • Typy podpůrná šablona výrazů – například (valarray+valarray) a inicializační seznamy – i když jen zřídka byste se rozhodli napsat auto x = { 1 }; a skutečně očekávat int.

Chcete-li použít auto klíčové slovo, použijte místo typu deklarovat proměnnou a zadat výraz inicializace.In addition, můžete změnit auto klíčové slovo pomocí specifikátorů a declarators jako const, volatile, ukazatel (*), odkaz (&) a odkaz rvalue (&&).Kompilátor vyhodnotí výraz inicializace a potom použije tyto informace odvodit typ proměnné.

Inicializace výrazu může být přiřazení (znaménko rovná syntaxe), přímé inicializace (funkce styl syntaxe), nebo nový operátor výrazu.Nebo může být výraz inicializace prohlášení pro oblast parametr v Příkaz For založený na rozsahu (C++) prohlášení.Další informace naleznete v tématu Inicializátory a příklady kódu dále v tomto dokumentu.

auto Klíčové slovo je zástupný symbol pro typ, ale není sám typu.Proto auto klíčové slovo nelze použít v nádech nebo operátory, jako je například sizeof a identifikátor TypeId..

Užitečnost

auto Klíčové slovo je jednoduchý způsob, jak deklarovat proměnnou, která má složitý typ.Například můžete použít auto pro deklarování proměnné, kde výraz inicializace zahrnuje šablony, ukazatele na funkce nebo odkazy na členy.

Můžete také použít auto Chcete-li deklarovat a inicializovat proměnnou pro lambda výrazy.Nemůžete deklarovat typ proměnné sami protože typ lambda výraz známý pouze kompilátoru.Další informace naleznete v tématu Příklady výrazů Lambda.

Můžete použít auto, jakož i decltype specifikátoru pomoci napsat šablonu knihovny typu.Použití auto a decltype k deklarování funkce šablony, jejichž návrat typ závisí na typech argumentů šablony.Nebo pomocí auto a decltype k deklarování funkce šablony, který obtéká volání jinou funkci a vrátí čímkoliv, co je návratový typ tuto funkci.Další informace naleznete v tématu Specifikátor typu decltype.

Omezení a chybové zprávy

Následující tabulka obsahuje omezení pro použití auto klíčové slovo a odpovídající diagnostické chybové zprávy, která kompilátor vydává.

Číslo chyby

Description

C3530

auto Klíčové slovo nelze kombinovat s jakékoli jiné-specifikátor typu.

C3531

Symbol, který je deklarován s auto klíčové slovo musí mít inicializátor.

C3532

Je nesprávně použit auto Chcete-li deklarovat typ.Například deklarovat návratový typ metody nebo pole.

C3533, C3539

Parametr nebo šablonu argumentu nelze deklarovat s auto klíčové slovo.

C3534

Symbol, který je deklarován s auto klíčové slovo v new výraz musí mít inicializátor.Další informace naleznete v tématu operator new (<new>).

C3535

Parametr metody nebo šablonu nelze použít deklaraci se auto klíčové slovo.

C3536

Symbol nelze použít, dříve, než je inicializován.V praxi to znamená, že proměnné nelze inicializovat.

C3537

Nelze přetypovat na typ, který je deklarován s auto klíčové slovo.

C3538

Všechny symboly, které jsou v seznamu deklarátor, která je deklarována s auto klíčové slovo, musí odpovídat stejného typu.Další informace naleznete v tématu Prohlášení.

C3540, C3541

Sizeof a identifikátor TypeId. operators nelze použít symbol, který je deklarován s auto klíčové slovo.

Příklady

Tyto fragmenty kódu ilustrují způsoby, v němž auto můžete použít klíčové slovo.

Tato prohlášení jsou ekvivalentní.V prvním příkazu proměnné j je deklarován jako typ int.V druhém příkazu proměnné k je odvozen typ int protože inicializace výrazu (0) je celé číslo.

   int j = 0;  // Variable j is explicitly type int.
   auto k = 0; // Variable k is implicitly type int because 0 is an integer.

Tato prohlášení jsou rovnocenné, ale druhý prohlášení je jednodušší než první.Jedním z nejvíce přesvědčivé důvody pro použití auto klíčové slovo je jednoduchost.

   map<int,list<string>>::iterator i = m.begin(); 
   auto i = m.begin(); 

Následující fragment kódu deklaruje typ proměnné iter a elem když for a oblast for skočí start.

// cl /EHsc /nologo /W4
#include <deque>
using namespace std;

int main()
{
    deque<double> dqDoubleData(10, 0.1);

    for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
    { /* ... */ }

    // prefer range-for loops with the following information in mind
    // (this applies to any range-for with auto, not just deque)

    for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
    { /* ... */ }

    for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
    { /* ... */ }

    for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
    { /* ... */ }
}

Následující fragment kódu používá new operátor a ukazatel prohlášení deklarovat ukazatele.

   double x = 12.34;
   auto *y = new auto(x), **z = new auto(&x);

Následující fragment kódu deklaruje více symbolů v každém příkazu prohlášení.Všimněte si, všechny symboly v každém příkazu převést na stejného typu.

   auto x = 1, *y = &x, **z = &y; // Resolves to int.
   auto a(2.01), *b (&a);         // Resolves to double.
   auto c = 'a', *d(&c);          // Resolves to char.
   auto m = 1, &n = m;            // Resolves to int.

Tento fragment kódu pomocí podmíněného operátoru (?:) pro deklarování proměnné x jako celé číslo, které má hodnotu 200:

   int v1 = 100, v2 = 200;
   auto x = v1 > v2 ? v1 : v2;

Následující fragment kódu inicializuje proměnnou x k zadání int, proměnné y na odkaz na typ constinta proměnné fp na ukazatel na funkci, která vrací typ int.

int f(int x) { return x; }
int main()
{
    auto x = f(0);
    const auto & y = f(1);
    int (*p)(int x);
    p = f;
    auto fp = p;
    //...
}

Viz také

Referenční dokumentace

Klíčové slovo auto

Specifikátory paměťových tříd

Klíčových slov jazyka C++

/Zc:Auto (odvodit typ proměnné)

Operátor sizeof

identifikátor TypeId.

operator new (<new>)

Prohlášení

Příklady výrazů Lambda

Inicializátory

Specifikátor typu decltype