Я хочу иметь возможность получить указатель на функцию лямбда в С++.
Я могу сделать:
int (*c)(int) = [](int i) { return i; };
И, конечно же, следующие работы - даже если это не создает указатель на функцию.
auto a = [](int i) { return i; };
Но следующее:
auto *b = [](int i) { return i; };
Дает эту ошибку в GCC:
main.cpp: In function 'int main()':
main.cpp:13:37: error: unable to deduce 'auto*' from '<lambda closure object>main()::<lambda(int)>{}'
auto *b = [](int i) { return i; };
^
main.cpp:13:37: note: mismatched types 'auto*' and 'main()::<lambda(int)>'
Кажется произвольным, что лямбда может быть преобразована в указатель функции без проблемы, но компилятор не может вывести тип функции и создать указатель на нее с помощью auto *
. Особенно, когда он может неявно преобразовать unique, lambda type
в указатель функции:
int (*g)(int) = a;
Я создал небольшую тестовую кровать в http://coliru.stacked-crooked.com/a/2cbd62c8179dc61b, которая содержит приведенные выше примеры. Такое поведение аналогично для С++ 11 и С++ 14.