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