Classes and class hierarchies
C.170
Если хочется перегрузить лямбду — используйте обобщённую лямбду
Причина
Нельзя перегрузить функцию, определив два разных лямбда-выражения с одним именем.
Пример
void f(int);
void f(double);
auto f = [](char); // ошибка: нельзя перегрузить переменную и функцию
auto g = [](int) { /* ... */ };
auto g = [](double) { /* ... */ }; // ошибка: нельзя перегрузить переменные
auto h = [](auto) { /* ... */ }; // OK
Контроль
Компилятор сам поймает попытку перегрузить лямбду.
C.union: Объединения
union — это struct, в которой все члены начинаются с одного адреса, поэтому в каждый момент времени она может хранить только один из них. union не отслеживает, какой член хранится в данный момент — программист обязан делать это самостоятельно; по своей сути это чревато ошибками, однако существуют способы снизить этот риск.
Тип, представляющий собой union вместе с индикатором того, какой член хранится, называется тегированным объединением (tagged union), размеченным объединением (discriminated union) или вариантом.
Сводка правил для объединений: