Verwenden der C ++ 11-bereichsbasierten for-Schleife in Qt

Gemäßdieses Gespräch es gibt eine gewisse Gefahr bei der Verwendung von C ++ 11 Range Basefor auf Qt-Behältern. Erwägen

QList<MyStruct> list;

for(const MyStruct &item : list)
{
    //...
}

Die Falle, so der Vortrag, ergibt sich aus dem impliziten Teilen. Unter der Haube holt der Fernkämpfer den Iterator aus dem Container. Aber weil der Container nicht const ist, ist der Interator nicht const, und das reicht anscheinend aus, damit sich der Container löst.

Wenn Sie die Lebensdauer eines Containers steuern, ist dies einfach zu beheben. Sie übergeben lediglich die const-Referenz an den Container, um ihn zur Verwendung von const_iterator zu zwingen und nicht zum Trennen.

QList<MyStruct> list;
const Qlist<MyStruct> &constList = list;

for(const MyStruct &item : constList)
{
    //...
}

Was ist jedoch mit Containern als Rückgabewerte?

QList<MyStruct> foo() { //... }

void main()
{
    for(const MyStruct &item : foo())
    {
    }
}

Was passiert hier? Wird der Container noch kopiert? Intuitiv würde ich sagen, es ist so, um zu vermeiden, dass dies getan werden muss?

QList<MyStruct> foo() { //... }

main()
{ 
    for(const MyStruct &item : const_cast<const QList<MyStruct>>(foo()))
    {
    }
}

Ich bin mir nicht sicher. Ich weiß, dass es etwas ausführlicher ist, aber ich brauche dies, weil ich häufig Ranging-basierte For-Loops für große Container verwende, sodass das Gerede mich auf die richtige Saite gebracht hat.

Bisher verwende ich eine Hilfsfunktion, um den Container in die const-Referenz zu konvertieren, aber wenn es einen einfacheren / kürzeren Weg gibt, dies zu erreichen, würde ich es gerne hören.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage