Недавно я был удивлен тем фактом, что lambdas можно назначить std::function с несколько разными сигнатурами. Немного другое значение, указывающее, что возвращаемые значения лямбды могут быть проигнорированы, если указано function для возврата void, или что параметры могут быть ссылками в function, но значениями в лямбда.
Смотрите этот пример (ideone), где я выделил то, что, как я подозреваю, несовместимо. Я бы подумал, что возвращаемое значение не является проблемой, поскольку вы всегда можете вызвать функцию и игнорировать возвращаемое значение, но преобразование из ссылки на значение выглядит странно для меня:
int main() {
    function<void(const int& i)> f;
    //       ^^^^ ^^^^^    ^
    f = [](int i) -> int { cout<<i<<endl; return i; };
    //     ^^^    ^^^^^^
    f(2);
    return 0;
}
Незначительный вопрос: зачем этот код компилируется и работает? Главный вопрос: каковы общие правила преобразования типов лямбда-параметров и возвращаемых значений при использовании вместе с std::function?
