Tiêu chuẩn C++ 11 nói (hoặc ít nhất, phiên bản tôi có - không phải là chính thức một):Tại sao "chuyển đổi con trỏ lambda thành chức năng" ẩn chứa "chụp tham chiếu" các thành viên tĩnh?
Kiểu đóng cửa cho một lambda-biểu với không lambda-chụp có công cộng hàm chuyển đổi không rõ ràng không ảo cho con trỏ để hoạt động có cùng tham số và kiểu trả về như toán tử gọi hàm của loại đóng .
Tôi hiểu tại sao không thể lấy con trỏ hàm từ lambda stateful vì con trỏ hàm không thể tự giữ bất kỳ dữ liệu nào. Tuy nhiên, khi các đối tượng bị bắt chỉ là một thành viên tĩnh/biến tĩnh, không có giới hạn như vậy vì các tham chiếu đến các đối tượng đã chụp có thể được hardwired trong chính hàm đó.
struct A {
static int count = 0;
void foo() {
static int bar = 0;
auto fun = [&]()->void {
count++;
bar++;
};
void(*ptrFun)();
ptrFun = fun; // forbidden by the quoted wording
}
};
Tại sao không phải lúc nào cũng có thể chuyển đổi lambda thành con trỏ hàm ngay khi trước đây là trạng thái không trạng thái? Tôi có thiếu một cái gì đó hay không ủy ban đã quên điểm cụ thể này?
Tôi dự đoán rằng đó là để tránh yêu cầu trình biên dịch có thể chứng minh được nhiều thứ về những gì đang bị bắt. – Flexo
Trình biên dịch đã có thể tự động nắm bắt các biến ngay sau khi chúng được sử dụng (sử dụng [&] tự động, vì vậy nó sẽ không đòi hỏi nhiều công việc hơn để kiểm tra xem chúng có phải là thành viên tĩnh hay toàn cục hay không được tuyên bố trước đó. –
Trên thực tế tôi đã không thử nghiệm nó trên bất kỳ trình biên dịch (Tôi chỉ có MSVC10 mà không hỗ trợ chuyển đổi con trỏ chức năng ở tất cả). Tôi đoán nó là một phần mở rộng GCC? Dù sao, câu hỏi của tôi là: nó được cho phép theo tiêu chuẩn (có lẽ tôi đã bỏ lỡ điều gì đó)? Nếu không, tại sao nó bị cấm (có thể có một giới hạn kỹ thuật mà tôi không biết)? –