Hardname-lookuptemplates

Что такое two-phase lookup?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

При компиляции шаблона имя ищется в две фазы. Phase 1 (при определении): non-dependent имена. Phase 2 (при инстанцировании): dependent имена через ADL и обычный lookup.

template<typename T>
void f(T t) {
    g(42);            // non-dependent: должен быть виден ЗДЕСЬ
    t.foo();          // dependent: ищется в точке инстанцирования
    typename T::iterator it;  // typename обязателен для dependent типа
    T::template bar<int>();   // template — для dependent template
}

Dependent name — зависит от T (T::foo(), bar(x) где x типа T). Чтобы указать, что dependent name — тип, нужно typename; что это шаблон — template. MSVC исторически не реализовывал two-phase полностью (нужен /permissive-).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.