Aracılığıyla paylaş


auto (C++)

Bildirilen değişkenin türünü başlatma ifadesinden kaldırır.

Dekont

C++ standardı, bu anahtar sözcük için özgün ve düzeltilmiş bir anlamı tanımlar. Visual Studio 2010'un öncesinde anahtar sözcüğü otomatik auto depolama sınıfında bir değişken bildirir; yani yerel ömrü olan bir değişkendir. Visual Studio 2010'dan başlayarak anahtar sözcüğü, auto türü bildirimindeki başlatma ifadesinden çıkarılmış bir değişken bildirir. /Zc:auto[-] Derleyici seçeneği anahtar sözcüğün auto anlamını denetler.

Sözdizimi

autobildirimcibaşlatıcısı;

[](autoparam1, autoparam2) {};

Açıklamalar

auto anahtar sözcüğü, derleyiciyi bildirilen değişkenin başlatma ifadesini veya lambda ifade parametresini kullanarak türünü bildirmeye yönlendirir.

Dönüştürmeyi gerçekten istemediğiniz sürece çoğu durumda anahtar sözcüğünü auto kullanmanızı öneririz çünkü bu avantajlar sağlar:

  • Sağlamlık: İfadenin türü değiştirilirse (işlev dönüş türü de dahil) yalnızca çalışır.

  • Performans: Dönüştürme olmaması garanti edilir.

  • Kullanılabilirlik: Tür adı yazım hataları ve yazım hataları konusunda endişelenmeniz gerekmez.

  • Verimlilik: Kodlamanız daha verimli olabilir.

kullanmak autoistemeyebileceğiniz dönüştürme durumları:

  • Belirli bir tür istiyorsanız başka hiçbir şey yapmazsınız.

  • İfade şablonu yardımcı türlerinde, örneğin, (valarray+valarray).

anahtar sözcüğünü auto kullanmak için değişkeni bildirmek için bir tür yerine kullanın ve bir başlatma ifadesi belirtin. Buna ek olarak, anahtar sözcüğünü auto , , volatileişaretçi (), başvuru (*) ve rvalue başvurusu (&&& gibi consttanımlayıcıları ve bildirimcileri kullanarak değiştirebilirsiniz. Derleyici başlatma ifadesini değerlendirir ve ardından değişkenin türünü bulmak için bu bilgileri kullanır.

Başlatma auto ifadesi birkaç biçim alabilir:

  • Evrensel başlatma söz dizimi, örneğin auto a { 42 };.
  • Atama söz dizimi, örneğin auto b = 0;.
  • Gibi auto c = { 3.14159 };önceki iki formu birleştiren evrensel atama söz dizimi.
  • Doğrudan başlatma veya gibi auto d( 1.41421f );oluşturucu stili söz dizimi.

Daha fazla bilgi için bu belgenin devamında başlatıcılar ve kod örnekleri konusuna bakın.

auto Döngü parametresini aralık tabanlı for bir deyimde bildirmek için kullanıldığında, örneğin for (auto& i : iterable) do_action(i);farklı bir başlatma söz dizimi kullanır. Daha fazla bilgi için bkz . Aralık Tabanlı for Deyim (C++).

anahtar auto sözcüğü bir tür için yer tutucudur, ancak kendisi bir tür değildir. Bu nedenle anahtar sözcüğü ve auto (C++/CLI için) typeidgibi sizeof atamalarda veya işleçlerde kullanılamaz.

Yararı

auto anahtar sözcüğü, karmaşık bir türe sahip bir değişken bildirmenin basit bir yoludur. Örneğin, başlatma ifadesinin şablonlar, işlevler işaretçileri veya üyelere yönelik işaretçiler içerdiği bir değişken bildirmek için kullanabilirsiniz auto .

Bir lambda ifadesi için değişken bildirmek ve başlatmak için de kullanabilirsiniz auto . Bir lambda ifadesinin türü yalnızca derleyici tarafından bilindiğinden değişkenin türünü kendiniz bildiremezsiniz. Daha fazla bilgi için bkz . Lambda İfadeleri Örnekleri.

Sondaki Dönüş Türleri

Şablon kitaplıkları yazmaya yardımcı olmak için, türünü belirtici ile decltype birlikte kullanabilirsinizauto. dönüş türü şablon bağımsız değişkenlerinin türlerine bağlı olan bir işlev şablonu bildirmek için ve decltype kullanınauto. Alternatif olarak, bir çağrıyı başka bir işleve sarmalayan ve ardından diğer işlevin dönüş türü olan her şeyi döndüren bir işlev şablonu bildirmek için ve decltype kullanınauto. Daha fazla bilgi için bkz. decltype.

Başvurular ve cv niteleyicileri

Başvuruları, const niteleyicileri ve volatile niteleyicileri bırakmaauto. Aşağıdaki örneği inceleyin:

// 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;
}

Önceki örnekte, myAuto bir intint başvuru değil, bu nedenle başvuru niteleyicisi tarafından autobırakılmamışsa, çıkış 11 11şeklinde değildir11 12.

Kümeli başlatıcılarla tür kesintisi (C++14)

Aşağıdaki kod örneği, küme ayraçları kullanarak bir auto değişkenin nasıl başlatılmış olduğunu gösterir. B ve C ile A ile E arasındaki farka dikkat edin.

#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;
}

Kısıtlamalar ve hata iletileri

Aşağıdaki tabloda, anahtar sözcüğün auto kullanımıyla ilgili kısıtlamalar ve derleyicinin yaydığı ilgili tanılama hata iletisi listelenir.

Hata numarası Tanım
C3530 Anahtar auto sözcük, başka bir tür belirtici ile birleştirilemiyor.
C3531 anahtar sözcüğüyle bildirilen bir simgenin auto başlatıcısı olmalıdır.
C3532 Türü bildirmek için anahtar sözcüğünü auto yanlış kullandınız. Örneğin, bir yöntem dönüş türü veya dizi bildirdiniz.
C3533, C3539 Parametre veya şablon bağımsız değişkeni anahtar sözcüğüyle auto bildirilemiyor.
C3535 Yöntem veya şablon parametresi anahtar sözcüğüyle auto bildirilemiyor.
C3536 Simge başlatılmadan önce kullanılamaz. Pratikte, bir değişkenin kendisini başlatmak için kullanılamayacağı anlamına gelir.
C3537 anahtar sözcüğüyle bildirilen bir türe auto dönüştüremezsiniz.
C3538 Anahtar sözcüğüyle bildirilen bildirimci listesindeki tüm simgelerin auto aynı türe çözümlenmesi gerekir. Daha fazla bilgi için bkz . Bildirimler ve Tanımlar.
C3540, C3541 Sizeof ve typeid işleçleri anahtar sözcüğüyle bildirilen bir simgeye auto uygulanamaz.

Örnekler

Bu kod parçaları, anahtar sözcüğün kullanılabilmesinin auto bazı yollarını gösterir.

Aşağıdaki bildirimler eşdeğerdir. İlk deyimde değişken j türü intolarak bildirilir. İkinci deyimde, başlatma ifadesi (0) bir tamsayı olduğundan değişken k tür int olarak çıkarılır.

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

Aşağıdaki bildirimler eşdeğerdir, ancak ikinci bildirim ilkinden daha basittir. Anahtar sözcüğünü kullanmanın auto en cazip nedenlerinden biri basitliktir.

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

Aşağıdaki kod parçası değişkenlerin iter türünü ve elem ve aralığı for döngülerinin ne zaman for başladığını bildirir.

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

Aşağıdaki kod parçası, işaretçileri bildirmek için işleç ve işaretçi bildirimini kullanır new .

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

Sonraki kod parçası, her bildirim deyiminde birden çok simge bildirir. Her deyimdeki tüm simgelerin aynı türe çözümlendiğini fark edin.

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.

Bu kod parçası, değişkeni x 200 değerine sahip bir tamsayı olarak bildirmek için koşullu işlecini (?:) kullanır:

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

Aşağıdaki kod parçası, türü için değişkenix, türüne intconst intyönelik bir başvuruya değişken y ve türü döndüren intbir işleve yönelik bir işaretçiye değişken fp başlatır.

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;
    //...
}

Ayrıca bkz.

Anahtar Sözcükler
/Zc:auto (Değişken türünü çıkar)
sizeof Işleç
typeid
operator new
Bildirimler ve tanımlar
Lambda ifadelerine örnekler
Başlatıcılar
decltype