Я экспериментирую с лямбдами и с тем, что разные лямбда-выражения имеют разные типы, даже если они одинаковы.Рассмотрим этот код
#include <iostream>
template <typename T> void once(T t){
static bool first_call = true;
if (first_call) t();
first_call = false;
}
int main() {
int counter = 0;
auto a = [&counter](){counter++;};
once(a);
once(a);
std::cout << counter; // 1
auto b = a; // same type
once(b);
std::cout << counter; // 1
auto c = [&counter](){counter++;}; // different type
once(c);
once(c);
std::cout << counter; // 2
}
Это печатает 112
, то есть a
и b
, конечно, одного типа, а c
другого типа.
Разрешено ли компилятору разрешать c
того же типа, что и a
?
Я имею в виду, что выражения идентичны, и это будет очевидной оптимизацией,
PS: Если захват предотвращает такую оптимизацию, то как быть с лямбдами без захвата?
related: что такое сигнатура типа лямбда-функции c ++ 11 / 1y? и Можно ли выразить «тип» лямбда-выражения?