Это работает …
auto x = 4;
typedef decltype(x) x_t;
x_t y = 5;
… так почему бы и нет?
int j = 4;
auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;};
typedef decltype(func) lambda_t;
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;};
… и как бы я объявил lambda_t
вручную используя std :: function?
… так почему это не [работает]?
Потому что каждый лексический экземпляр лямбды имеет свой тип. Неважно, используются ли одинаковые символы.
.. и как бы я объявил lambda_t вручную, используя std :: function?
Лямбда принимает аргумент int и ничего не возвращает … Поэтому:
typedef std::function<void(int)> lambda_t;
Лямбда-типы невыразимый (не может быть назван), поэтому вы не можете делать то, что просите. Кроме того, каждая лямбда имеет свой тип, поэтому даже если бы вы могли назвать тип, вы не сможете назначить вторую лямбду первой. Если вы думаете о лямбда-синтаксисе как о ярлыке для функционального объекта, который становится понятнее: член operator()
отличается для каждой лямбды и, следовательно, они разных типов.
С другой стороны, вы можете назначить лямбду std::function<>
объект соответствующей подписи, который в вашем случае будет std::function<void(int)>
,
Вот несколько убедительных доказательств того, что это не работает. Аналогичный сценарий:
int foo = 3;
int bar = 3;
std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type
Теперь давайте использовать точно такой же код, но с лямбдами. Как вы думаете, ответ будет.
auto foo = [](){std::cout << "HELLO\n"; };
auto bar = [](){std::cout << "HELLO\n"; };
std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same.