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
auto
bildirimcibaşlatıcısı;
[](auto
param1, auto
param2) {};
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 auto
istemeyebileceğ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
, , volatile
işaretçi (), başvuru (*
) ve rvalue başvurusu (&
&&
gibi const
tanı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) typeid
gibi 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 int
int
başvuru değil, bu nedenle başvuru niteleyicisi tarafından auto
bı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ü int
olarak 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 int
const int
yönelik bir başvuruya değişken y
ve türü döndüren int
bir 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin