2015-03-19 15 views
6

có một câu hỏi về chức năng quá tải. Nhìn vào mã này:Quá tải chức năng theo con trỏ hàm

#include<iostream> 

void fv(int){} 
void fc(const int){} 
void fvr(int&){} 
void fcr(const int&){} 

void fm(void(*fun)(const int)) 
{ 
    std::cout << "Constant called" << std::endl; 
} 

//void fm(void(*fun)(int)) 
//{ 
// std::cout << "non Constant called" << std::endl; 
//} 

void fm(void(*fun)(const int&)) 
{ 
    std::cout << "Constant ref called" << std::endl; 
} 

void fm(void(*fun)(int&)) 
{ 
    std::cout << "non Constant ref called" << std::endl; 
} 

int main() 
{ 
    fm(&fc); 
    fm(&fv); 
    fm(&fvr); 
    fm(&fcr); 
    return 0; 
} 

nếu bạn bỏ ghi chú void fm(void(*fun)(int)) chức năng bạn thấy rằng trình biên dịch có thể không tĩnh quá tải chức năng của con trỏ về chức năng chấp nhận tham số theo giá trị và con trỏ về chức năng chấp nhận giá trị const. Ngoài ra, nếu bạn bỏ ghi chú void(*fun)(const int) và nhận xét void(*fun)(const int) thì tất cả biên dịch đều thành công. Nhưng, nếu chúng ta sử dụng tài liệu tham khảo, nó biên dịch OK. Đừng hiểu tại sao, bạn có thể giải thích cho tôi được không? Điều này có nghĩa là con trỏ hàm có tham số chấp nhận theo giá trị và bởi giá trị const có cùng loại không?

UPD: Top-level const doesn't influence a function signature Có giải thích tốt lý do tại sao nên xóa cấp cao nhất.

Trả lời

3

Có, cấp cao nhất sẽ bị xóa. Lỗi từ gcc

định nghĩa lại ‘khoảng trống fm (void (*) (int))’

Như bạn thấy const được giảm.

Trích từ N3376 8.3.5/5

Sau khi sản xuất danh sách các loại tham số, bất kỳ cấp cao nhất cv-vòng loại thay đổi một kiểu tham số sẽ bị xóa khi tạo kiểu chức năng.

+0

lý do tại sao giá trị này giảm cho giá trị và không bị giảm đối với tham chiếu? – brachistochron

+0

@brachistochron chỉ vì const trong tham chiếu không phải là cấp cao nhất const. – ForEveR

+0

vâng, cảm ơn, cảm ơn. nhưng vẫn không thể hiểu tại sao nó hoạt động theo cách này =) – brachistochron

2

Có bạn không thể quá tải chức năng dựa trên Ness const của một hàm con trỏ/không tham chiếu không, xem: Functions with const arguments and Overloading

nào đến lượt nó ngụ ý rằng con trỏ đến chức năng mà tham số chấp nhận theo giá trị và giá trị const cùng loại.

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