Wordt een op C++11-bereik gebaseerde for-lus-voorwaarde elke cyclus geëvalueerd?

Als memoryManager 1000 items bevat, wordt memoryManager.getItems()dan 1000 keer aangeroepen of slechts één aan het begin van de lus?

Voert de compiler optimalisatie toe met -O2 (of -O3)?

(memoryManager.getItems()retourneert een std::vector<Entity*>&)


Antwoord 1, autoriteit 100%

Het wordt maar één keer geëvalueerd. De standaard definieert een op een bereik gebaseerde for-instructie als equivalent aan:

{
    auto && __range = range-init;
    for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
        for-range-declaration = *__begin;
        statement
    }
}

waarbij range-initde uitdrukking is (tussen haakjes) of braced-init-list na de :

Other episodes