Aracılığıyla paylaş


Uyarı C26817

Range-for döngüsünde değişken adının pahalı olabilecek bir kopyası. Bunu bir sabit başvuru (es.71) yapmayı düşünün.

Daha fazla bilgi için C++ Çekirdek Yönergeleri'ndeki ES.71 notlarına bakın.

Örnek

Bir döngü için aralık değişkeni açıkça başvuru olarak işaretlenmemişse, her öğenin bir kopyası yinelenir:

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

Uyarı, skalerler (işaretçiler, aritmetik türler vb.) gibi kopyalanması ucuz olan bazı türleri yoksayıyor.

Bu sorunu düzeltmek için döngü değişkeni döngünün herhangi bir yerinde sessize alınmıyorsa, bunu sabit bir başvuru yapın:

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

anahtar const sözcüğü döngü değişkenini sabit hale getirir. Const olmayan bir başvurunun kullanılması, kapsayıcının öğelerini değiştirmek için istemeden başvurunun kullanılmasını mümkün kılar. Yalnızca yerel döngü değişkenini değiştirmeniz gerekiyorsa, pahalı olabilecek kopyalama kaçınılmazdır.