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

autodeclaratorinitializer;

[](autoparam1, autoparam2) {};

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, , volatilepointer (*), 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