I can not understand what needs to be done so that you can operate with pointers to a lambda expression with variable capture, as well as without capturing variables? And in the third example, why functions f and f3 cannot be called, but function f2 is called?
// ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ(ΡΡΠΏΠ΅ΡΠ½ΡΠΉ) auto fo = [](void*) ->unsigned {std::cout << 5 << std::endl; return 0; }; unsigned(*fo2) (void*); decltype (auto) fo3 = fo; fo2 = fo; // ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ. Π ΡΠ΅ΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°? fo2(nullptr);// ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ fo(nullptr); // ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ fo3(nullptr);// ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ // Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΡΠΉ, Π½ΠΎ Ρ Π·Π°Ρ
Π²Π°ΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π»ΡΠΌΠ±Π΄Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ auto foo = [&](void*) ->unsigned {std::cout << 5 << std::endl; return 0; }; unsigned(*foo2) (void*); decltype (auto) foo3 = foo; foo2 = foo;// ΠΠ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ. ΠΠΎΡΠ΅ΠΌΡ? foo(nullptr); // ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ foo3(nullptr);// ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ // ΡΡΠ΅ΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ auto *f = &[](void*) ->unsigned {std::cout << 5 << std::endl; return 0; }; unsigned(*f2) (void*); decltype (auto) f3 = f; f2 = *f;// ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ f2(nullptr);// ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ // ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ f ΠΈ f3 ? f(nullptr);// ΠΠ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ *(f(nullptr));// ΠΠ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ f3(nullptr);// ΠΠ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ *(f3(nullptr));// ΠΠ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ