Проверка корректности range‑based for для пользовательского контейнера

В показанном виде цикл не скомпилируется: IntContainer не предоставляет begin/end. Наличие внутри поля vec не заставляет range-based for автоматически обходить это поле.

Короткий ответ

Что ответить на собеседовании

В показанном виде цикл не скомпилируется: IntContainer не предоставляет begin/end. Наличие внутри поля vec не заставляет range-based for автоматически обходить это поле.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо выяснить, сможет ли следующий фрагмент кода компилироваться и работать как ожидается. Структура IntContainer содержит std::vector<int> и используется в диапазонном цикле for. Вопрос: будет ли выражение for (const auto& element : container) компилироваться и корректно исполняться?

struct IntContainer {
    std::vector<int> vec;
};

void testRange() {
    IntContainer container;
    for (const auto& element : container) {
        // ...
    }
}

Ответ

В показанном виде цикл не скомпилируется: IntContainer не предоставляет begin/end. Наличие внутри поля vec не заставляет range-based for автоматически обходить это поле.

Либо используйте for (const auto& element : container.vec), либо добавьте в структуру методы:

auto begin() noexcept { return vec.begin(); }
auto end() noexcept { return vec.end(); }
auto begin() const noexcept { return vec.begin(); }
auto end() const noexcept { return vec.end(); }

Возможен и вариант свободных begin/end, находящихся через ADL в пространстве имён типа. После исправления пустой vector даст ноль итераций; преобразование IntContainer к vector для этого механизма само по себе не требуется.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее