Tôi đã tự hỏi làm thế nào để kiểm tra chính xác nếu một std::function
trống rỗng. Hãy xem xét ví dụ này:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Mã này biên dịch tốt trong MSVC nhưng nếu tôi gọi doSomething()
mà không khởi tạo eventFunc
mã thì rõ ràng là bị treo. Đó là mong đợi nhưng tôi đã tự hỏi giá trị của là eventFunc
gì? Trình gỡ lỗi nói 'empty'
. Vì vậy, tôi đã sửa điều đó bằng cách sử dụng câu lệnh if đơn giản:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Điều này hoạt động nhưng tôi vẫn tự hỏi giá trị của không khởi tạo là std::function
gì? Tôi muốn viết if (eventFunc != nullptr)
nhưng std::function
(rõ ràng) không phải là một con trỏ.
Tại sao nếu tinh khiết hoạt động? Điều kỳ diệu đằng sau nó là gì? Và, nó là cách chính xác làm thế nào để kiểm tra nó?
eventFunc
không phải là lambda; nó là mộtstd::function
. Bạn có thể lưu trữ lambdas bằngstd::function
s, nhưng chúng không giống nhau.