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
auto
inicializátor deklarátoru;
[](auto
param1, auto
param2) {};
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 const
je , , volatile
ukazatel (*
), 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 auto
společ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 , int
nikoli odkaz, takže výstup je 11 11
, ne 11 12
tak jako v případě, že odkaz kvalifikátor nebyl vyřazen auto
int
.
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 int
a 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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro