как правильно узнать тип возврата лямбды

в основном, как сделать следующий код скомпилировать?

Я знаю, что это не удалось, потому что компилятор пытался оценить что-то вроде([](int &i){})(0) а как решить проблему?

template <class TElement>
struct foo {
    TElement _e;
    foo(TElement e) : _e(e){}
    template <class Lambda>
    void bar(Lambda f) {
        using TResult = decltype(std::declval<Lambda>()(std::declval<TElement>()));
    }
};

int main() {

    foo<int>(0).bar([](int i){}); // compile
    foo<int>(0).bar([](int &&i){}); // compile
    foo<int>(0).bar([](int const &i){}); // compile
    foo<int>(0).bar([](int &i){}); // failed

}

Ответы на вопрос(3)

Ваш ответ на вопрос