Почему допускается 2-е присваивание, когда предполагаемый тип возвращаемого значения — std :: nullptr_t? С указателями на функции это запрещено.
И почему не запускается 2-я лямбда?
#include <cstdio>
#include <functional>
int main()
{
std::function<void* ()> f;
f = []() -> void* {
printf ("runs\n");
return nullptr;
};
f();
f = []() {
printf ("doesn't run\n");
return nullptr; // -> std::nullptr_t
};
f();
return 0;
}
std::function
позволяет хранить что угодно, при условии, что для подписи, которую вы указали, действует следующее:
std::nullptr_t
неявно преобразуется в любой тип указателя и дает нулевое значение указателя этого типа указателя.
Обратите внимание, что ваш код на самом деле не является допустимым C ++ 11, так как у вас есть не только return expr;
во второй лямбде как таковой вычет типа возврата не произойдет. GCC (и Clang, IIRC) реализуют это как расширение, так как в будущем оно станет частью стандарта.
Других решений пока нет …