Tôi thấy rằng lvalue
việc đóng lambda luôn có thể được truyền dưới dạng rvalue
tham 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::function
mụ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::function
thể 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::function
có 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::function
khô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::function
trongfoo(fn1)
. Chức năng tạm thời sau đó là một giá trị.