Bagikan melalui


Peringatan C26817

Salinan nama variabel yang berpotensi mahal dalam rentang-untuk perulangan. Pertimbangkan untuk menjadikannya referensi const (es.71).

Untuk informasi selengkapnya, lihat Catatan ES.71 di Panduan Inti C++.

Contoh

Jika variabel perulangan rentang-untuk tidak secara eksplisit ditandai sebagai referensi, variabel tersebut mendapatkan salinan dari setiap elemen yang diulang melalui:

#include <vector>

class MyComplexType {
    int native_array[1000];
    // ...
};

void expensive_function(std::vector<MyComplexType>& complex_vector_ref)
{
    for (auto item: complex_vector_ref) // Warning: C26817
    {
        // At each iteration, item gets a copy of the next element
        // ...
    }
    for (MyComplexType item: complex_vector_ref)
    {
        // It happens whether you use the auto keyword or the type name
        // ...
    }
}

Peringatan ini mengabaikan beberapa jenis yang murah untuk disalin seperti untuk skalar (pointer, jenis aritmatika, dan sebagainya).

Untuk memperbaiki masalah ini, jika variabel perulangan tidak bermutasi di mana pun dalam perulangan, jadikan itu referensi const:

#include <vector>

class MyComplexType {
    int native_array[1000];
    // ...
};

void less_expensive_function(std::vector<MyComplexType>& complex_vector_ref)
{
    for (const auto& item: complex_vector_ref)
    {
        // item no longer gets a copy of each iterated element
        // ...
    }
    for (const MyComplexType& item: complex_vector_ref)
    {
        // item no longer gets a copy of each iterated element
        // ...
    }
}

Kata const kunci membuat variabel perulangan tidak dapat diubah. Penggunaan referensi non-const memungkinkan untuk secara tidak sengaja menggunakan referensi untuk memodifikasi elemen kontainer. Jika Anda hanya perlu memodifikasi variabel perulangan lokal, penyalinan yang berpotensi mahal tidak dapat ditolak.