Đây có lẽ là một câu hỏi triết học, nhưng tôi chạy vào các vấn đề sau đây:Tại sao std :: các thể hiện hàm có một hàm tạo mặc định?
Nếu bạn xác định một std :: chức năng, và bạn không khởi tạo nó một cách chính xác, ứng dụng của bạn sẽ sụp đổ, như thế này:
typedef std::function<void(void)> MyFunctionType;
MyFunctionType myFunction;
myFunction();
Nếu hàm được thông qua như là một cuộc tranh cãi, như thế này:
void DoSomething (MyFunctionType myFunction)
{
myFunction();
}
Sau đó, tất nhiên, nó cũng bị treo. Điều này có nghĩa rằng tôi buộc phải thêm kiểm tra mã như thế này:
void DoSomething (MyFunctionType myFunction)
{
if (!myFunction) return;
myFunction();
}
Yêu cầu các kiểm tra mang lại cho tôi một flash trở lại những ngày C cũ, nơi bạn cũng phải rà soát tất cả đối số con trỏ một cách rõ ràng:
void DoSomething (Car *car, Person *person)
{
if (!car) return; // In real applications, this would be an assert of course
if (!person) return; // In real applications, this would be an assert of course
...
}
may mắn thay, chúng ta có thể sử dụng tài liệu tham khảo trong C++, mà ngăn cản tôi từ viết những kiểm tra (giả định rằng người gọi đã không vượt qua các nội dung của một nullptr đến chức năng:
void DoSomething (Car &car, Person &person)
{
// I can assume that car and person are valid
}
Vì vậy, wh y do std :: instance instance có một hàm tạo mặc định? Nếu không có hàm tạo mặc định, bạn sẽ không phải thêm các kiểm tra, giống như các đối số bình thường khác của một hàm. Và trong những trường hợp 'hiếm' mà bạn muốn chuyển một hàm 'std ::' tùy chọn, bạn vẫn có thể truyền con trỏ tới nó (hoặc sử dụng boost :: optional).
Nó không sụp đổ; nó ném một ngoại lệ. –
Đọc về 'functors': http://www.sgi.com/tech/stl/functors.html –
" Tôi buộc phải thêm mã kiểm tra "- đáng tiếc là người gọi của bạn không thể sửa mã của họ thay thế. Có vẻ kỳ quặc để hủy bỏ để cứu họ cần phải xử lý các ngoại lệ. Tuy nhiên, nó có thể tồi tệ hơn, nếu bạn lấy một con trỏ hàm và chúng không bận tâm khởi tạo nó, thì nó sẽ có một giá trị không xác định và hành vi sẽ không được xác định. Có lẽ chúng đang rối tung hơn nữa gọi là 'strlen' hơn là chúng đang gọi chức năng của bạn. –