Он может компилироваться, потому что тип лямбда-выражения является анонимным классом, который может быть создан (но см. Примечание ниже). Блок кода - это метод этого класса operator()()
. Этот класс создается как значение параметра по умолчанию конструктором std::unordered_map
- с использованием типа лямбда-выражения, который является аргументом шаблона:
unordered_map( InputIt first, InputIt last,
size_type bucket_count = /*implementation-defined*/,
const Hash& hash = Hash(), /* <<<< INSTANTIATION HAPPENS HERE */
const key_equal& equal = key_equal(),
const Allocator& alloc = Allocator() );
Подробнее о природе лямбда-выражений см. В этом вопросе SO :
Что такое лямбда-выражение в C ++ 11?
Примечание. Как отмечают комментаторы, ваш код фактически не компилируется с C ++ 11 , поскольку неявный конструктор по умолчанию для анонимного класса, определенного лямбда-выражением, удален в C ++ 11. Это было изменено в C ++ 20: лямбда-выражения без захвата получают конструктор по умолчанию, поэтому теперь код компилируется.