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.
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
@brachistochron chỉ vì const trong tham chiếu không phải là cấp cao nhất const. – ForEveR
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