Udostępnij za pośrednictwem


Auto słowa kluczowego (Typ potrącenia)

Deduces typ zadeklarowana zmienna z wyrażenia jego inicjowania.

auto declarator initializer;

Uwagi

auto Słowa kluczowego Określa, że kompilator umożliwia wyrażenie inicjowania zadeklarowana zmienna wywnioskować jego typu.

[!UWAGA]

Przed Visual C++ 2010, auto słowa kluczowego było specyfikatorem automatyczne klasy magazynowania.Sposób użycia, że jest teraz błąd./Zc:auto Opcji kompilatora, co jest ustawieniem domyślnym, nakazuje kompilatorowi, aby użyć nowego rozumieniu auto słowa kluczowego.

Firma Microsoft zaleca użycie auto słowa kluczowego w większości sytuacji — chyba że naprawdę chcesz konwersji — ponieważ daje następujące korzyści:

  • Niezawodności: Jeśli zmieni się typ wyrażenia — dotyczy to po zmianie typu zwracanego funkcji — po prostu działa.

  • Wydajność: masz wówczas gwarancję, że nie będzie bez konwersji.

  • Użyteczność: nie trzeba się martwić o trudności pisownię nazwy typu i literówek.

  • Wydajność: swoje kodowania może być bardziej efektywne.

Konwersja przypadków, w których nie może być stosowana ma być auto:

  • Kiedy chcesz określonego typu i nic innego nie zrobi.

  • Typy pomocnika szablonu wyrażenie — na przykład, (valarray+valarray) i list — mimo że rzadko czy użytkownik chce napisać auto x = { 1 }; i naprawdę spodziewają się uzyskać int.

Aby użyć auto słowa kluczowego, to za pomocą zamiast typu Aby zadeklarować zmienną i wyrażenie inicjowania.In addition, można zmodyfikować auto słowa kluczowego przy użyciu takich jak Specyfikatory i declarators const, volatile, wskaźnik (*), odwołanie (&) i r-wartości odniesienia (&&).Kompilator oblicza wyrażenie inicjowania, a następnie używa tych informacji było wywnioskowanie typ zmiennej.

Wyrażenie inicjowania może być przydziału (składnia znak równości), bezpośredniego inicjowania (Składnia funkcji stylu), lub operatora new wyrażenie.Lub wyrażenie inicjowania może być dla zakresu zadeklarowanego parametr w Range-based for — instrukcja (C++) instrukcji.Aby uzyskać więcej informacji, zobacz Inicjatory i przykłady kodu w dalszej części tego dokumentu.

auto Słowo kluczowe jest symbolem zastępczym dla określonego typu, ale nie jest sam typu.W związku z tym auto słowo kluczowe nie można używać w prezentacji lub operatorów takich jak sizeof i TypeID.

Przydatność

auto Słowo kluczowe jest to prosty sposób, aby zadeklarować zmienną, która ma typ skomplikowane.Na przykład, można użyć auto Aby zadeklarować zmienną, jeżeli wyrażenie inicjowania obejmuje szablony, wskaźników do funkcji lub wskaźniki do członków.

Można również użyć auto deklarować i Zainicjuj zmienną do wyrażenia lambda.Nie można zadeklarować typ zmiennej samodzielnie ponieważ typowi wyrażenia lambda jest znany tylko kompilator.Aby uzyskać więcej informacji, zobacz Przykłady wyrażeń Lambda.

Można użyć auto, wraz z decltype wpisz specyfikatora, pomoc w pisaniu biblioteki szablonu.Użycie auto i decltype deklarowania funkcji szablonu, którego powrót typu zależy od rodzaju podanych argumentów szablonu.Lub użyj auto i decltype deklarowania funkcji szablonu, który otacza połączenie do innej funkcji, a następnie zwraca, cokolwiek jest zwracany typ tego innych funkcji.Aby uzyskać więcej informacji, zobacz decltype specyfikatora typu.

Ograniczenia i komunikaty o błędach

W poniższej tabeli podano ograniczenia dotyczące stosowania auto słów kluczowych i odpowiedni komunikat błędu diagnostycznego, emitującego przez kompilator.

Numer błędu

Opis

C3530

auto Słów kluczowych nie można łączyć z dowolnym innym specyfikatora typu.

C3531

Symbol, który jest zadeklarowana z auto słowa kluczowego musi mieć inicjatorów.

C3532

Możesz nieodpowiednio wykorzystanych auto słowo kluczowe, aby zadeklarować typ.Na przykład zadeklarowany typ zwracany metoda lub tablicy.

C3533, C3539

Nie można zadeklarować jako argument parametru lub szablonu z auto słowa kluczowego.

C3534

Symbol, który jest zadeklarowana z auto słowa kluczowego w new wyrażenia musi istnieć inicjator.Aby uzyskać więcej informacji, zobacz operator new (<new>).

C3535

Nie można zadeklarować jako parametr metody lub szablon z auto słowa kluczowego.

C3536

Nie można użyć symbolu, przed jego inicjowania.W praktyce oznacza to, że zmienna może być użyty do inicjowanie sam.

C3537

Nie można rzutować na typ, która jest zadeklarowana za pomocą auto słowa kluczowego.

C3538

Wszystkie symbole na liście oświadczenie, która jest zadeklarowana z auto musi być rozpoznawana przez słowo kluczowe do tego samego typu.Aby uzyskać więcej informacji, zobacz Deklaracje.

C3540, C3541

Sizeof i TypeID podmioty gospodarcze nie można zastosować do symbolu, która jest zadeklarowana za pomocą auto słowa kluczowego.

Przykłady

Te fragmenty kodu ilustrują niektóre ze sposobów, w którym auto można użyć słowa kluczowego.

Następujące deklaracje są równoważne.Pierwsza instrukcja zmiennej j został zadeklarowany jako typ int.W drugim instrukcja zmiennej k jest wyprowadzony być typu int ponieważ wyrażenie inicjowania (0) jest liczbą całkowitą.

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

Następujące deklaracje są równoważne, ale drugi deklaracja jest prostsze niż pierwszy.Jednym z najbardziej istotnych powodów, aby użyć auto słowo kluczowe jest prostota.

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

Poniższy fragment kodu deklaruje typ zmiennych iter i elem po for i zakres for start w pętli.

// 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
    { /* ... */ }
}

Poniższy fragment kodu używa new operatora i wskaźnik deklaracja zadeklarować wskaźniki.

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

Następny fragment kodu deklaruje wiele symboli w każdej instrukcji deklaracji.Należy zauważyć, że wszystkie symbole w każdej instrukcji rozpoznać tego samego 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.

Ten fragment kodu używa operator warunkowy (?:) Aby zadeklarować zmienną x jako liczba całkowita, która ma wartość 200:

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

Poniższy fragment kodu inicjuje zmienną x typu int, zmienne y do odwołanie do typu constinti zmienna fp się we wskaźnik do funkcji, która zwraca 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;
    //...
}

Zobacz też

Informacje

Auto słowo kluczowe

Specyfikatory klasy magazynu

Słów kluczowych języka C++

/Zc:Auto (typ zmiennej wywnioskowanie)

Operatora sizeof

TypeID

operator new (<new>)

Deklaracje

Przykłady wyrażeń Lambda

Inicjatory

decltype specyfikatora typu