auto
(C++)
Menyimpulkan jenis variabel yang dideklarasikan dari ekspresi inisialisasinya.
Catatan
Standar C++ mendefinisikan arti asli dan direvisi untuk kata kunci ini. Sebelum Visual Studio 2010, auto
kata kunci mendeklarasikan variabel di kelas penyimpanan otomatis ; yaitu, variabel yang memiliki masa pakai lokal. Dimulai dengan Visual Studio 2010, auto
kata kunci mendeklarasikan variabel yang jenisnya disimpulkan dari ekspresi inisialisasi dalam deklarasinya. Opsi /Zc:auto[-]
pengkompilasi mengontrol arti kata auto
kunci.
Sintaks
auto
declaratorinitializer;
[](auto
param1, auto
param2) {};
Keterangan
Kata auto
kunci mengarahkan pengkompilasi untuk menggunakan ekspresi inisialisasi variabel yang dideklarasikan, atau parameter ekspresi lambda, untuk menyimpulkan jenisnya.
Kami menyarankan agar Anda menggunakan auto
kata kunci untuk sebagian besar situasi—kecuali Anda benar-benar menginginkan konversi—karena memberikan manfaat berikut:
Ketahanan: Jika jenis ekspresi diubah—termasuk saat jenis pengembalian fungsi diubah—jenis tersebut hanya berfungsi.
Performa: Anda dijamin tidak ada konversi.
Kegunaan: Anda tidak perlu khawatir tentang kesulitan ejaan nama jenis dan kesalahan ketik.
Efisiensi: Pengkodan Anda bisa lebih efisien.
Kasus konversi di mana Anda mungkin tidak ingin menggunakan auto
:
Anda menginginkan jenis tertentu dan tidak ada yang lain yang akan dilakukan.
Dalam jenis pembantu templat ekspresi—misalnya,
(valarray+valarray)
.
Untuk menggunakan auto
kata kunci, gunakan alih-alih jenis untuk mendeklarasikan variabel, dan tentukan ekspresi inisialisasi. Selain itu, Anda dapat memodifikasi auto
kata kunci dengan menggunakan penentu dan deklarator seperti const
, , volatile
pointer (*
), referensi (&
), dan referensi rvalue (&&
). Pengkompilasi mengevaluasi ekspresi inisialisasi lalu menggunakan informasi tersebut untuk menyimpulkan jenis variabel.
Ekspresi auto
inisialisasi dapat mengambil beberapa formulir:
- Sintaks inisialisasi universal, seperti
auto a { 42 };
. - Sintaks penugasan, seperti
auto b = 0;
. - Sintaks tugas universal, yang menggabungkan dua bentuk sebelumnya, seperti
auto c = { 3.14159 };
. - Inisialisasi langsung, atau sintaks gaya konstruktor, seperti
auto d( 1.41421f );
.
Untuk informasi selengkapnya, lihat Penginisialisasi dan contoh kode nanti dalam dokumen ini.
Ketika auto
digunakan untuk mendeklarasikan parameter perulangan dalam pernyataan berbasis for
rentang, parameter tersebut menggunakan sintaks inisialisasi yang berbeda, misalnya for (auto& i : iterable) do_action(i);
. Untuk informasi selengkapnya, lihat Pernyataan Berbasis for
rentang (C++).
Kata auto
kunci adalah tempat penampung untuk jenis, tetapi bukan jenisnya sendiri. Oleh karena itu, auto
kata kunci tidak dapat digunakan dalam transmisi atau operator seperti sizeof
dan (untuk C++/CLI) typeid
.
Kegunaan
Kata auto
kunci adalah cara sederhana untuk mendeklarasikan variabel yang memiliki jenis rumit. Misalnya, Anda dapat menggunakan auto
untuk mendeklarasikan variabel di mana ekspresi inisialisasi melibatkan templat, penunjuk ke fungsi, atau penunjuk ke anggota.
Anda juga dapat menggunakan auto
untuk mendeklarasikan dan menginisialisasi variabel ke ekspresi lambda. Anda tidak dapat mendeklarasikan sendiri jenis variabel karena jenis ekspresi lambda hanya diketahui oleh pengkompilasi. Untuk informasi selengkapnya, lihat Contoh Ekspresi Lambda.
Tipe Pengembalian Berikutnya
Anda dapat menggunakan auto
, bersama dengan penentu decltype
jenis, untuk membantu menulis pustaka templat. Gunakan auto
dan decltype
untuk mendeklarasikan templat fungsi yang jenis pengembaliannya bergantung pada jenis argumen templatnya. Atau, gunakan auto
dan decltype
untuk mendeklarasikan templat fungsi yang membungkus panggilan ke fungsi lain, lalu mengembalikan apa pun yang merupakan jenis pengembalian dari fungsi lain tersebut. Untuk informasi selengkapnya, lihat decltype
.
Referensi dan kualifikasi cv
Menggunakan auto
referensi drops, const
qualifier, dan volatile
qualifier. Pertimbangkan contoh berikut:
// 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;
}
Dalam contoh sebelumnya, myAuto adalah , bukan int
referensi, sehingga outputnya adalah 11 11
, bukan 11 12
seperti yang akan terjadi jika kualifikasi referensi belum dihilangkan oleh auto
.int
Ketik pengurangan dengan inisialisasi dikurung (C++14)
Contoh kode berikut menunjukkan cara menginisialisasi auto
variabel menggunakan kurung kurawal. Perhatikan perbedaan antara B dan C dan antara A dan 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;
}
Pembatasan dan pesan kesalahan
Tabel berikut mencantumkan pembatasan penggunaan auto
kata kunci, dan pesan kesalahan diagnostik terkait yang dikeluarkan pengkompilasi.
Nomor kesalahan | Deskripsi |
---|---|
C3530 | Kata auto kunci tidak dapat dikombinasikan dengan penentu jenis lainnya. |
C3531 | Simbol yang dideklarasikan dengan auto kata kunci harus memiliki penginisialisasi. |
C3532 | Anda salah menggunakan auto kata kunci untuk mendeklarasikan jenis. Misalnya, Anda mendeklarasikan jenis pengembalian metode atau array. |
C3533, C3539 | Argumen parameter atau templat tidak dapat dideklarasikan dengan auto kata kunci. |
C3535 | Metode atau parameter templat tidak dapat dideklarasikan dengan auto kata kunci. |
C3536 | Simbol tidak dapat digunakan sebelum diinisialisasi. Dalam praktiknya, itu berarti bahwa variabel tidak dapat digunakan untuk menginisialisasi dirinya sendiri. |
C3537 | Anda tidak dapat mentransmisikan ke jenis yang dideklarasikan dengan auto kata kunci. |
C3538 | Semua simbol dalam daftar deklarator yang dideklarasikan dengan auto kata kunci harus diselesaikan ke jenis yang sama. Untuk informasi selengkapnya, lihat Deklarasi dan Definisi. |
C3540, C3541 | Operator sizeof dan typeid tidak dapat diterapkan ke simbol yang dideklarasikan dengan auto kata kunci. |
Contoh
Fragmen kode ini menggambarkan beberapa cara di mana auto
kata kunci dapat digunakan.
Deklarasi berikut setara. Dalam pernyataan pertama, variabel j
dinyatakan sebagai jenis int
. Dalam pernyataan kedua, variabel k
disimpulkan menjadi jenis int
karena ekspresi inisialisasi (0) adalah bilangan bulat.
int j = 0; // Variable j is explicitly type int.
auto k = 0; // Variable k is implicitly type int because 0 is an integer.
Deklarasi berikut setara, tetapi deklarasi kedua lebih sederhana daripada yang pertama. Salah satu alasan paling menarik untuk menggunakan auto
kata kunci adalah kesederhanaan.
map<int,list<string>>::iterator i = m.begin();
auto i = m.begin();
Fragmen kode berikut mendeklarasikan jenis variabel iter
dan elem
kapan for
perulangan rentang for
dan dimulai.
// 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
{ /* ... */ }
}
Fragmen kode berikut menggunakan new
operator dan deklarasi pointer untuk mendeklarasikan pointer.
double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);
Fragmen kode berikutnya mendeklarasikan beberapa simbol dalam setiap pernyataan deklarasi. Perhatikan bahwa semua simbol dalam setiap pernyataan diselesaikan ke jenis yang sama.
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.
Fragmen kode ini menggunakan operator kondisional (?:
) untuk mendeklarasikan variabel x
sebagai bilangan bulat yang memiliki nilai 200:
int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;
Fragmen kode berikut menginisialisasi variabel x
untuk mengetik int
, variabel y
ke referensi untuk mengetik const int
, dan variabel fp
ke penunjuk ke fungsi yang mengembalikan jenis 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;
//...
}
Baca juga
Kata kunci
/Zc:auto
(Menyimpulkan jenis variabel)
Operator sizeof
typeid
operator new
Deklarasi dan definisi
Contoh ekspresi lambda
Penginisialisasi
decltype
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk