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 подскажет развёрнутый ответ в реальном времени.