Nếu bạn quá tải một chức năng và sau đó gọi nó với một lập luận cho rằng hoàn toàn phù hợp với một trong những quá tảiQuy tắc chuyển đổi ngầm của đối số mẫu
int f(int){return 3;}
int f(bool){return 4;}
... //inside main()
f(1); //Calls f(int)
trình biên dịch chỉ đơn giản là chọn này (hoàn hảo) phù hợp trước khi thực hiện bất kỳ chuyển đổi ngầm . Tuy nhiên tôi đã cố gắng để quá tải một hàm template như trong
template <bool veracity>
int f(){return 1;}
template <int amount>
int f(){return 2;}
... //inside main()
f<1>();
nhưng trình biên dịch tiếp tục complainning về cuộc gọi mơ hồ đến f quá tải(), trong đó nêu nó có thể là một trong hai f<true>()
hay f<1>()
. Không nên trình biên dịch chỉ chọn kết hợp hoàn hảo, thay vì cố gắng chuyển đổi thành đúng?
Tôi đã ấn tượng rằng chuyển đổi tiềm ẩn cho đối số mẫu thực sự hạn chế hơn chuyển đổi ngầm định đối số hàm. Có cách nào để giải quyết vấn đề này không?
tôi nhìn thấy. Bạn có biết nếu có một lý do cụ thể tại sao các quy tắc như thế này? Tôi có nghĩa là, có một số khó khăn kỹ thuật hoặc một cái gì đó mà sẽ làm cho nó imnpracticable cho trình biên dịch để áp dụng "chính xác phù hợp với đầu tiên/ngầm-chuyển đổi-thứ hai" logic (được sử dụng trong các đối số chức năng) cho các đối số mẫu? – Malabarba
Không, tôi không biết chắc chắn. Đoán của tôi sẽ là nó chủ yếu là vì các quy tắc đã được phức tạp, và thêm một bộ quy tắc cho "xếp hạng" như nó không cho quá tải sẽ làm cho họ thậm chí nhiều hơn như vậy. Tôi không chắc chắn, nhưng tôi đoán là do tương tác với các quy tắc khác cho các mẫu, các quy tắc xếp hạng sẽ kết thúc ít nhất một chút khác với các quy tắc cho quá tải, vì vậy nó sẽ không chỉ là vấn đề nói "các chức năng của ứng cử viên sẽ tạo thành một bộ quá tải được giải quyết theo §13.3." –
Làm cho tinh thần.Cảm ơn. =) – Malabarba