2012-08-09 54 views
6

đây:chức năng 'hợp lệ' std :: là gì?

http://en.cppreference.com/w/cpp/utility/functional/function

operator bool được mô tả: "Kiểm tra xem đối tượng có thể được gọi là lưu trữ có giá trị".

Có lẽ mặc định được xây dựng std::function không hợp lệ nhưng đây có phải là trường hợp duy nhất không?

Ngoài ra, nó kiểm tra xem nó có hợp lệ không?

Trường hợp trong đó operator() tăng std::bad_function_call chính xác trường hợp đối tượng không hợp lệ?

Trả lời

7

Nó được viết kém như, sự nhầm lẫn của bạn là hợp lý. Bởi "hợp lệ" họ có nghĩa là "có một mục tiêu".

Một std::function "có một mục tiêu" khi nó được gán một chức năng:

std::function<void()> x; // no target 
std::function<void()> y = some_void_function; // has target 

x = some_other_void_function; // has target 
y = nullptr; // no target 

x = y; // no target 

Họ cần phải có một trong hai định nghĩa "hợp lệ" trước khi sử dụng nó, hoặc đơn giản là bị mắc kẹt với các từ ngữ chính thức.

+0

OK, vì vậy kiểm tra tính hợp lệ chỉ là kiểm tra kiểu và gọi hàm dựng sẵn 'std :: function' chính xác là trường hợp' std :: bad_function_call' được nâng lên, yup? – dpj

+0

@ user710408: Tôi không biết ý bạn là gì "kiểm tra tính hợp lệ chỉ là kiểm tra kiểu". Hiệu lực (bây giờ giả định định nghĩa "có một mục tiêu") được xác định tại thời gian chạy, kiểm tra kiểu xảy ra tại thời gian biên dịch. Và cuộc gọi chức năng xấu xảy ra bất cứ khi nào hàm không hợp lệ (không có mục tiêu), là từ việc xây dựng mặc định hoặc được gán rõ ràng 'nullptr'. – GManNickG

+0

Tôi không nghĩ rằng tôi biết những gì tôi có nghĩa là một trong hai! Cảm ơn :) – dpj

1

Tiêu chuẩn ngôn ngữ nói

explicit operator bool() const noexcept;

Returns: true nếu * này có một mục tiêu, nếu không sai.

Có nghĩa là function có mọi thứ cần gọi. Mặc định xây dựng function rõ ràng là không.

Các vấn đề liên quan