Tôi thấy rằng lvalueviệc đóng lambda luôn có thể được truyền dưới dạng rvaluetham số hàm.
Xem trình diễn đơn giản sau đây.
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void()>&& t)
{
}
int main()
{
    // Case 1: passing a `lvalue` closure
    auto fn1 = []{};
    foo(fn1);                          // works
    // Case 2: passing a `lvalue` function object
    std::function<void()> fn2 = []{};
    foo(fn2);                          // compile error
    return 0;
}
Trường hợp 2 là hành vi tiêu chuẩn (tôi chỉ sử dụng một std::functionmục đích trình diễn, nhưng bất kỳ loại nào khác cũng sẽ hành xử tương tự).
Làm thế nào và tại sao trường hợp 1 hoạt động? Trạng thái fn1đóng sau khi hàm trả về là gì?
std::functionthể suy luận các mẫu đối số được suy ra từ lambda". Chương trình của bạn không cố gắng suy ra các đối số mẫu của std::function, vì vậy không có vấn đề gì với việc chuyển đổi ngầm định.
                std::functioncó một hàm tạo không rõ ràng chấp nhận các bao đóng lambda, do đó có chuyển đổi ngầm định. Nhưng trong trường hợp của câu hỏi được liên kết, việc khởi tạo mẫu std::functionkhông thể được suy ra từ loại lambda. (Ví dụ std::function<void()>có thể được xây dựng từ [](){return 5;}mặc dù nó có loại trả về không trống.
                
fn1được ngầm chuyển đổi sang mộtstd::functiontrongfoo(fn1). Chức năng tạm thời sau đó là một giá trị.