Общие лямбды были введены в C++14
.
Проще говоря, тип замыкания, определенный лямбда-выражением, будет иметь шаблонный оператор вызова, а не обычный, не шаблонный оператор вызова лямбда-выражений C++11
(конечно, когда он auto
хотя бы один раз появляется в списке параметров).
Итак, ваш пример:
auto glambda = [] (auto a) { return a; };
Сделаем glambda
экземпляр такого типа:
class /* unnamed */
{
public:
template<typename T>
T operator () (T a) const { return a; }
};
В параграфе 5.1.2 / 5 стандартного проекта C ++ 14 n3690 указывается, как определяется оператор вызова типа закрытия данного лямбда-выражения:
Тип закрытия для неуниверсального лямбда-выражения имеет общедоступный встроенный оператор вызова функции (13.5.4), параметры и возвращаемый тип которого описываются предложением-объявлением-параметром лямбда-выражения и конечным-возвращаемым-типом соответственно. Для универсальной лямбда-выражения тип замыкания имеет общедоступный встроенный шаблон-член оператора вызова функции (14.5.2), чей список-параметров шаблона состоит из одного придуманного параметра-шаблона типа для каждого вхождения auto в предложении-объявлении параметра лямбда, в порядке появления. Шаблон-параметр изобретенного типа является пакетом параметров, если соответствующее объявление параметра объявляет пакет параметров функции (8.3.5). Тип возвращаемого значения и параметры функции шаблона оператора вызова функции являются производными от конечного-возвращаемого-типа и предложения-параметра лямбда-выражения путем замены каждого вхождения auto в описателях-объявлениях предложения-объявления-параметра на имя соответствующий придуманный шаблон-параметр.
В заключение:
Похож ли это на шаблоны, в которых для каждого другого типа аргумента компилятор генерирует функции с одним и тем же телом, но с измененными типами, или он больше похож на дженерики Java?
Как поясняется в предыдущем абзаце, общие лямбды - это просто синтаксический сахар для уникальных безымянных функторов с шаблонным оператором вызова. Это должно ответить на ваш вопрос :)