Không rõ độ phân giải quá tải sẽ hoạt động như thế nào. Điều gì nếu, nói, container chứa các vị từ?
struct pred
{
bool operator()(const pred&) const;
friend bool operator==(const pred&,const pred&);
};
std::vector<pred> v;
pred p;
std::find(v.begin(), v.end(), p); // what should happen here?
Khả năng mơ hồ này có thể tránh được khi có chức năng với tên gọi khác nhau, mỗi tên thể hiện ý định rõ ràng hơn.
Lưu ý rằng đây là sự đơn giản hóa: không có yêu cầu trong std::find
rằng đối tượng tham chiếu có cùng loại với value_type
của vùng chứa, chỉ là chúng có thể so sánh được với sự bình đẳng. Các yêu cầu đối với biến vị ngữ trong std::find_if
tương tự nhau. Cả hai hàm này đều cực kỳ chung chung, có nghĩa là một sự mơ hồ có thể phát sinh dễ dàng hơn trong ví dụ đã cho. Ví dụ:
struct foo {};
struct pred
{
bool operator()(const foo&) const;
};
bool operator==(const foo&, const pred&);
int main()
{
std::vector<foo> v;
pred p;
std::find(v.begin(), v.end(), p); // What should this do?
std::find_if(v.begin(), v.end(), p); // Here, it is clear.
}
"hiếm"? Nếu không có một số mẹo SFINAE họ sẽ không thể phân biệt bởi quá tải độ phân giải tất cả các thời gian. –