auto (C++)

Odvodí typ deklarované proměnné z inicializačního výrazu.

Poznámka

Standard C++ definuje původní a revidovaný význam tohoto klíčového slova. Před sadou Visual Studio 2010 auto klíčové slovo deklaruje proměnnou v automatické třídě úložiště, tj. proměnnou, která má místní životnost. Počínaje sadou Visual Studio 2010 auto klíčové slovo deklaruje proměnnou, jejíž typ je odvozen z inicializačního výrazu v jeho deklaraci. Možnost /Zc:auto[-] kompilátoru řídí význam klíčového auto slova.

Syntaxe

autoinicializátor deklarátoru;

[](autoparam1, autoparam2) {};

Poznámky

Klíčové auto slovo nasměruje kompilátor na použití inicializačního výrazu deklarované proměnné nebo parametru výrazu lambda k odstranění jeho typu.

Doporučujeme použít auto klíčové slovo pro většinu situací , pokud opravdu nechcete převod, protože poskytuje tyto výhody:

  • Robustnost: Pokud se změní typ výrazu , včetně změny návratového typu funkce, funguje to jenom.

  • Výkon: Zaručujete, že neexistuje žádný převod.

  • Použitelnost: Nemusíte se starat o potíže s pravopisem a překlepy v názvu typu.

  • Efektivita: Kódování může být efektivnější.

Převodní případy, ve kterých možná nebudete chtít použít auto:

  • Chcete konkrétní typ a nic jiného se neudělá.

  • V pomocných typech šablon výrazů , (valarray+valarray)například .

Pokud chcete použít auto klíčové slovo, použijte ho místo typu k deklaraci proměnné a zadejte inicializační výraz. Kromě toho můžete klíčové slovo upravit auto pomocí specifikátorů a deklarátorů, jako constje , , volatileukazatel (*), odkaz (&) a odkaz na hodnotu rvalue (&&). Kompilátor vyhodnocuje inicializační výraz a pak pomocí těchto informací odvodí typ proměnné.

Výraz auto inicializace může mít několik forem:

  • Univerzální inicializační syntaxe, například auto a { 42 };.
  • Syntaxe přiřazení, například auto b = 0;.
  • Syntaxe univerzálního přiřazení, která kombinuje dvě předchozí formy, například auto c = { 3.14159 };.
  • Přímá inicializace nebo syntaxe stylu konstruktoru, například auto d( 1.41421f );.

Další informace naleznete v části Inicializátory a příklady kódu dále v tomto dokumentu.

Pokud auto se používá k deklaraci parametru smyčky v příkazu založeném na for rozsahu, používá jinou syntaxi inicializace, například for (auto& i : iterable) do_action(i);. Další informace najdete v tématu Příkaz založený na for rozsahu (C++).

Klíčové auto slovo je zástupný symbol pro typ, ale není to samotný typ. Klíčové slovo proto nelze použít v přetypování nebo operátorech, auto jako sizeof je a (pro C++/CLI). typeid

Užitečnost

Klíčové auto slovo je jednoduchý způsob, jak deklarovat proměnnou, která má komplikovaný typ. Můžete například deklarovat auto proměnnou, ve které inicializační výraz zahrnuje šablony, ukazatele na funkce nebo ukazatele na členy.

Můžete také použít auto k deklaraci a inicializaci proměnné do výrazu lambda. Typ proměnné nemůžete deklarovat sami, protože typ výrazu lambda je známý pouze kompilátoru. Další informace naleznete v tématu Příklady výrazů lambda.

Koncové návratové typy

Ke psaní knihoven šablon můžete použít autospolečně se specifikátorem decltype typu. Použijte auto a decltype deklarujte šablonu funkce, jejíž návratový typ závisí na typech argumentů šablony. Nebo použijte auto a decltype deklarujte šablonu funkce, která zabalí volání jiné funkce, a pak vrátí jakýkoli návratový typ této jiné funkce. Další informace najdete na webu decltype.

Odkazy a kvalifikátory cv

Použití auto odkazů, const kvalifikátorů a volatile kvalifikátorů Představte si následující příklad:

// cl.exe /analyze /EHsc /W4
#include <iostream>

using namespace std;

int main( )
{
    int count = 10;
    int& countRef = count;
    auto myAuto = countRef;

    countRef = 11;
    cout << count << " ";

    myAuto = 12;
    cout << count << endl;
}

V předchozím příkladu je myAuto , intnikoli odkaz, takže výstup je 11 11, ne 11 12 tak jako v případě, že odkaz kvalifikátor nebyl vyřazen autoint .

Odvozování typů pomocí složených inicializátorů (C++14)

Následující příklad kódu ukazuje, jak inicializovat proměnnou auto pomocí složených závorek. Všimněte si rozdílu mezi B a C a mezi A a E.

#include <initializer_list>

int main()
{
    // std::initializer_list<int>
    auto A = { 1, 2 };

    // std::initializer_list<int>
    auto B = { 3 };

    // int
    auto C{ 4 };

    // C3535: cannot deduce type for 'auto' from initializer list'
    auto D = { 5, 6.7 };

    // C3518 in a direct-list-initialization context the type for 'auto'
    // can only be deduced from a single initializer expression
    auto E{ 8, 9 };

    return 0;
}

Omezení a chybové zprávy

Následující tabulka uvádí omezení použití klíčového auto slova a odpovídající chybovou zprávu diagnostiky, kterou kompilátor generuje.

Číslo chyby Popis
C3530 Klíčové auto slovo nelze kombinovat s žádným jiným specifikátorem typu.
C3531 Symbol deklarovaný pomocí klíčového auto slova musí mít inicializátor.
C3532 Nesprávně jste použili auto klíčové slovo k deklaraci typu. Deklarovali jste například návratový typ metody nebo pole.
C3533, C3539 Parametr nebo argument šablony nelze deklarovat pomocí klíčového auto slova.
C3535 Metodu nebo parametr šablony nelze deklarovat pomocí klíčového auto slova.
C3536 Symbol nelze použít před inicializováním. V praxi to znamená, že proměnnou nelze použít k inicializaci samotné.
C3537 Nelze přetypovat na typ, který je deklarován klíčovým slovem auto .
C3538 Všechny symboly v seznamu deklarátoru deklarované pomocí klíčového auto slova se musí přeložit na stejný typ. Další informace naleznete v tématu Deklarace a definice.
C3540, C3541 U symbolu deklarovaného pomocí klíčového auto slova nelze použít operátory sizeof a typeid.

Příklady

Tyto fragmenty kódu ilustrují některé způsoby použití klíčového auto slova.

Následující deklarace jsou ekvivalentní. V prvním příkazu je proměnná j deklarována jako typ int. Ve druhém příkazu je proměnná k odvozena jako typ int , protože inicializační výraz (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.

Následující deklarace jsou ekvivalentní, ale druhá deklarace je jednodušší než první. Jedním z nejzajímavějších důvodů použití klíčového auto slova je jednoduchost.

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

Následující fragment kódu deklaruje typ proměnných iter a elem při for spuštění smyčky rozsahu for .

// 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 k deklaraci ukazatelů operátor a deklaraci ukazatele.

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

Další fragment kódu deklaruje více symbolů v každém příkazu deklarace. Všimněte si, že všechny symboly v každém příkazu se přeloží na stejný typ.

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 používá podmíněný operátor (?:) k deklaraci 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 na typ int, proměnnou y odkaz na typ const inta proměnnou fp ukazatele na funkci, která vrací typ int.x

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é

Klíčová slova
/Zc:auto (Deduce – typ proměnné)
sizeof Operátor
typeid
operator new
Deklarace a definice
Příklady výrazů lambda
Inicializátory
decltype