2012-09-15 34 views
5

tôi có thể thực sự sử dụng một chức năng quá tải như thế này:Chức năng quá tải với ellipsis

#include <iostream> 

void foo(...) 
{ 
    std::cout << "::foo(...) \n"; 
} 

void foo(int) 
{ 
    std::cout << "::foo(int) \n"; 
} 

int main() 
{ 
    foo(0); 
    foo('A'); 
    foo("str"); 
    foo(0, 1); 
} 

tiêu chuẩn gì nói về nó? Và trong những tình huống nào tôi sẽ nhận được :: foo (...)?

+1

đối số biến. –

Trả lời

0

Khi bạn khai báo một hàm theo cách sau:

void foo (...) 

này có nghĩa là foo chấp nhận bất kỳ số lượng các đối số.

Vì vậy, chức năng này sẽ được gọi khi điều này là phù hợp.

Trong trường hợp của bạn bất cứ khi nào bạn sẽ không viết:

foo(//Some single int). 

Trong chính cụ thể của bạn, điều này sẽ xảy ra:

foo(0)  //Calls foo(int). 
foo('A) //Calls foo (int). as you can convert a char to an int. 
foo("str") //Calls foo(...) . as you can not convert a string to an int. 
foo(1,2) //Calls foo(...) . as this is the only possible function 
      cause the second foo function only takes one int. 
0

void foo(...) sẽ mất đối số biến. Và nó sẽ được gọi khi không có hoặc kiểu đối số nào không khớp với danh sách đối số được cung cấp của hàm khác có cùng tên hàm.

foo(0);    //This will call void foo(int) function 
foo('A');   //This will call void foo(int) function 
foo("str");   //This will call void foo(...) function 
foo(0, 1);   //This will call void foo(...) function 

LƯU Ý:

Mặc dù lược hoạt động tốt với chức năng quá tải, nó không phải là rất khuyên bạn nên theo đuổi chức năng variadic. Ít nhất là không cho đến khi bạn có nhiều kinh nghiệm hơn trong C++ để hiểu những cạm bẫy. Tôi sẽ đề nghị sử dụng nó chỉ với khối try try trong đó có những tình huống khi lỗi không thể dự đoán được.

2
void foo(int) 

sẽ chấp nhận một đối số loại int.

void foo(...) 

chấp nhận bất kỳ số đối số nào, thuộc bất kỳ loại nào. Nó sẽ được chọn khi cuộc gọi không có một đối số int. Không phải là rất hữu ích, nói chung.

Cũng lưu ý rằng hành vi không xác định là chuyển đối tượng thuộc loại lớp thành ....

+0

Các loại lớp không phải POD, nghĩa là. (C++ 11 thể hiện yêu cầu này về tầm thường và thay đổi UB đối với hành vi được thực hiện có điều kiện được hỗ trợ.) –

+0

* hành vi được xác định có điều kiện được xác định * âm thanh thậm chí tệ hơn với tôi.:-) Trông rất giống * Không làm vậy! *. –

2

Trong N3337 tôi có thể thấy: -

13.3.2 chức năng tồn
Một chức năng ứng cử viên có ít hơn các thông số m là duy nhất khả thi nếu nó có một dấu chấm lửng trong danh sách tham số của nó (8.3. 5). Vì mục đích của độ phân giải quá tải, bất kỳ đối số nào không có tham số tương ứng được coi là đến “khớp với dấu ba chấm” (13.3.3.1.3).

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