2010-08-07 34 views
7

Liệu C++ đảm bảo tiêu chuẩn sau đây ?:C++ chuẩn, quá tải độ phân giải chức năng/phù hợp với

template<typename T> 
void function(T (&)[1]); 

template<typename T> 
void function(T*); 

int a[1]; 
function(a); // first function gets called, not second version 
+0

Tôi cũng muốn biết. – zneak

+2

Câu hỏi hay, nhưng chủ đề cho câu hỏi không quá nhiều. Bạn có nghĩ rằng bạn có thể làm cho nó phù hợp hơn, chẳng hạn như "Kiểu tham số T (&) [1] có phù hợp hơn T * cho một mảng trong các mẫu C++" chẳng hạn. Btw, tôi không chắc liệu nó có liên quan gì đến quá tải hay không. –

+0

@Mac Tôi đã thay đổi chủ đề một chút, có tốt hơn không? – Anycorn

Trả lời

6

Vâng, đây được đảm bảo, nhưng lý do là khác với những gì GMAN nói. Độ "mảng độ dài 1" quá tải sẽ được chọn vì nó là chuyên biệt hơn so với thứ hai trong mẫu chức năng một phần đơn đặt hàng. Về cơ bản, điều đó có nghĩa là một đối số trong biểu mẫu T(&)[1] sẽ luôn khớp với đối số mẫu thứ hai ở dạng T*, do đó, quá tải đầu tiên sẽ luôn được chọn khi chuỗi chuyển đổi không quyết định.

Từ 13.3.3:

Với những định nghĩa, một khả thi chức năng 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 số i, ICSI (F1) là không phải là một chuỗi chuyển đổi tồi tệ 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,

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

  • F1 và F2 là hàm mẫu, và các chức năng mẫu cho F1 là chuyên biệt hơn so với tấm tem- cho F2 theo quy tắc đặt hàng một phần được mô tả trong 14.5.5.2, hoặc, nếu không muốn nói rằng,

...

012.351.

Chức năng thông thường chỉ bị ảnh hưởng bởi mục đầu tiên; khi bất kỳ hàm mẫu nào nằm trong tập hợp các hàm ứng cử viên, mục thứ hai hoặc thứ ba có thể quyết định. Lý do chúng tôi muốn nó như thế là chúng tôi muốn có thể viết quá tải có vẻ mơ hồ dường như không rõ ràng. Ví dụ.

template <class T> void f(T); 
template <class T> void f(T*); 

nếu không sẽ không rõ ràng đối với int*. Trong C++ 0x, bạn thậm chí có thể viết các khai báo như:

template <class ...Ts>   void f(const Ts&... args); 
template <class T, class ... Ts> void f(const T& a, const Ts&... args); 

và thứ hai sẽ được chọn bất cứ khi nào có ít nhất một đối số.

+0

Từ @aaa trên câu trả lời đã xóa của tôi: @jpa Vì vậy, sự hiện diện của mẫu là những gì tạo nên sự khác biệt lớn? – GManNickG

+0

@GMan: Có, xem chỉnh sửa. – jpalecek

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