Giả sử tôi có một chức năng mà phải mất hai đối số,Tại sao các đối tượng được trả lại từ liên kết bỏ qua các đối số thừa?
void f(int x, int y);
và tôi muốn để ràng buộc một trong số họ. Tôi có thể sử dụng std::bind
như sau:
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF
chỉ mất một đối số, nhưng tôi có thể gọi nó bằng nhiều đối số. Những lập luận ngoài đầu tiên thậm chí không phải là của một loại mà làm cho bất kỳ ý nghĩa:
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
gì là mục đích của các đối tượng cho phép trở về từ bind
để được thông qua lập luận thêm? Nó cho phép các lỗi gọi để biên dịch mà sẽ bị từ chối bất kỳ nơi nào khác.
Trình biên dịch nào? Tôi đoán đây có thể chỉ là một trình biên dịch không phù hợp (bởi vì cho phép các đối số bổ sung đó thực sự không có ý nghĩa gì và tôi nghi ngờ tiêu chuẩn cho phép điều này). Ví dụ, MSVC mô phỏng các mẫu variadic bằng cách chỉ định mỗi mẫu variadic để lấy các đối số mẫu tối đa có thể và mặc định các đối số đó cho một số kiểu NIL. Có lẽ một cái gì đó như thế là nguyên nhân cho hành vi của bạn? –
@ChristianRau: Đó là một phần của tiêu chuẩn. Nó cũng là một phần của TR1. 20.8.2/4 đưa ra nhận xét rằng việc triển khai dự kiến là cho toán tử 'operator()' được biến đổi hóa đơn giản để lấy bất cứ thứ gì được truyền cho nó, bất kể kiểu hoặc số đối số. TR1 có từ ngữ tương tự. – KnowItAllWannabe
Trong trường hợp của bạn, f (w1, ..., wN) trong đó 'N = sizeof ... (bound_args)' (số args để ràng buộc cuộc gọi) phải là một biểu thức hợp lệ, xem 20.8.9.1.2/2 và 20.8.2/1. Chỉnh sửa: Nó không cho phép bất kỳ cách nào khác để gọi nó. – dyp