2017-02-16 37 views
9

Giả sử tôi có hai quá tải của một hàmcon trỏ Non-const thích const T & quá tải để const T *

template <typename T> 
void f(const T&) { 
    cout << "f(T&)" << endl; 
} 

template <typename T> 
void f(const T*) { 
    cout << "f(T*)" << endl; 
} 

Tại sao f(new int) giải quyết đến f(const T&) thay vì f(const T*)? Bất cứ nơi nào trong các cuộc đàm phán tiêu chuẩn về hành vi phản trực giác này?

http://ideone.com/kl8NxL

+4

'f (new int) 'giải quyết thành' f (const T &) 'với' T' được đặt thành 'int *', không phải với 'T' được đặt thành' int'. Nó giống như bạn đang gọi một hàm với chữ ký. 'f (int * const &); ' –

+0

Tôi biết phần này. Câu hỏi của tôi là, tại sao 'f (int * const &)' phù hợp hơn 'f (const int *)'? –

Trả lời

13

Để giải quyết quá tải với khấu trừ mẫu, bước đầu tiên là giải quyết mẫu. Sau đó, đặt hàng không theo mẫu được áp dụng cho các kết quả. Trong mã của bạn độ phân giải mẫu là:

void f(int * const &) // 1 

void f(int const *)  // 2 

Theo C++ 14 [over.ics.ref], một tham chiếu liên kết trực tiếp đến một cuộc tranh cãi như trong (1) là một chuyển đổi sắc (ngay cả khi có thêm cv-qualifiers). Sự ràng buộc của T đến T const & là một ràng buộc trực tiếp, tức là không có thời gian nào được tạo và ràng buộc.

Tuy nhiên, (2) liên quan đến chuyển đổi bằng cấp . Loại đối số int * phải được chuyển đổi thành const int * trước khi nó khớp với tham số chức năng.

Việc chuyển sắc được coi là một tiểu chuỗi bất kỳ chuỗi chuyển đổi phi bản sắc, như vậy (1) thắng theo nguyên tắc phụ chuỗi [over.ics.rank] /3.1.1

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