2013-05-26 21 views
7

Mã sau đây biên dịch tốt bằng gcc và tiếng kêu.Tại sao những tình trạng quá tải này không rõ ràng?

template <typename T> 
struct identity 
{ 
    typedef T type; 
}; 

template <typename T> 
void foo(typename identity<T>::type); 

template <typename T> 
void foo(T); 

int main() 
{ 
    foo<int>(0); 
} 

Có vẻ như độ phân giải quá tải đang chọn quá tải đầu tiên (số identity<T>::type một).

Ai đó có thể giải thích lý do tại sao tình trạng quá tải không rõ ràng? Theo như tôi có thể nói, khác biệt duy nhất giữa chúng là đối số của cái đầu tiên là ngữ cảnh không suy luận và đối số của cái thứ hai không phải là, nhưng vì tôi đang cung cấp đối số mẫu một cách rõ ràng, tôi không không thấy tại sao điều đó lại quan trọng.

+0

Thú vị. Rõ ràng chức năng thứ hai sẽ được chọn nếu bạn đã kích hoạt loại khấu trừ bằng cách không rõ ràng instantiating 'foo (0)' nhưng 'foo (0)' thay thế (Không có loại khấu trừ cho chức năng meta danh tính)[email protected] Prowl: Tôi không muốn đặt câu hỏi cho câu trả lời của bạn để chỉ ra rằng lý luận của bạn không rõ ràng vì nó có thể xuất hiện. Cho tham số foo một giá trị mặc định và gọi 'foo ()' không có tham số. Lập luận của bạn vẫn nên áp dụng nhưng bây giờ sự quá tải thực sự mơ hồ như HighCommander4 mong đợi. Trình diễn mẫu nhanh của các mẫu chức năng phức tạp. –

Trả lời

7

Cả hai tình trạng quá tải là khả thi, nhưng trước đây là chuyên biệt hơn so với sau, và do đó nó được chọn bởi độ phân giải quá tải.

mỗi đoạn 13.3.3/1 của C++ 11 tiêu chuẩn về độ phân giải quá tải:

[...] một chức năng hữu hiệu đối F1 được định nghĩa là một chức năng tốt hơn so với một chức năng hữu hiệu đối F2 nếu cho tất cả các đối i, ICSi(F1) không phải là một chuỗi tồi tệ chuyển đổi hơn ICSi(F2), và sau đó

- đối với một số tranh cãi j, ICSj(F1) là một chuỗi chuyển đổi tốt hơn ICSj(F2), hoặc, nếu không muốn nói rằng,

- ngữ cảnh là khởi tạo bởi chuyển đổi do người dùng xác định (xem 8.5, 13.3.1.5 và 13.3.1.6) và trình tự chuyển đổi chuẩn từ loại trả về F1 thành loại đích (nghĩa là loại thực thể được khởi tạo) là chuỗi chuyển đổi tốt hơn chuỗi chuyển đổi chuẩn từ loại trả về là F2 đối với loại đích. [...] hoặc, nếu không muốn nói rằng,

-F1 là một hàm phi mẫu và F2 là một hàm mẫu chuyên môn, hoặc, nếu không muốn nói rằng,

- F1F2 là hàm mẫu chuyên ngành và mẫu chức năng cho F1 chuyên biệt hơn so với mẫu cho F2 theo các quy tắc đặt hàng một phần được mô tả trong 14.5.6.2.

Quá trình xác định đó của hai mẫu chức năng là chuyên biệt hơn so với khác được nêu trong đoạn 14.5.6.2/2:

phần Lựa chọn trật tự nào trong hai mẫu chức năng là chuyên biệt hơn so khác bằng cách chuyển đổi mỗi mẫu lần lượt (xem đoạn tiếp theo) và thực hiện khấu trừ đối số mẫu bằng cách sử dụng hàm . Quá trình khấu trừ xác định xem một trong các mẫu có chuyên biệt hơn các mẫu khác hay không. Nếu như vậy, mẫu chuyên biệt hơn là mẫu được chọn bởi quá trình đặt hàng một phần.

+0

Làm cho cảm giác, cảm ơn! (Tôi trực giác nghĩ rằng "chuyên biệt hơn" là "có nghĩa là áp dụng cho một nhóm nhỏ hơn các loại đầu vào", đó là những gì tôi nghĩ là ý định, nhưng tôi thấy cách định nghĩa kỹ thuật của thuật ngữ không có nghĩa chính xác điều đó.) – HighCommander4

+0

@ HighCommander4: Rất vui được giúp :) Trực giác của bạn về "áp dụng cho một nhóm nhỏ hơn các loại đầu vào" có ý nghĩa, mặc dù - như bạn đã nhận ra - đôi khi nó có thể gây hiểu nhầm –

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