Mã sau được biên dịch trên g ++ 4.1.2 và g ++ 4.4.4. Cả hai đều cho kết quả ghi nhận trong các ý kiến.Gọi một hàm có con trỏ không const sẽ chuyển thành hàm mẫu trên một hàm lấy con trỏ tới const
int f(const int * a)
{
return 0;
}
template<typename A>
int f(A a)
{
return 1;
}
int main()
{
int x;
// return f(&x); // returns 1
return f((const int *)&x); // returns 0
}
Nó xuất hiện để đun sôi xuống đến một tiếng gọi của f(int *)
quyết tâm f<int *>(int *)
thay vì dự kiến f(const int *)
. Tôi thấy điều này gây sốc và hoàn toàn không trực quan.
Đây có phải là lỗi trong g ++, góc tối của C++ hay hiển nhiên vì một lý do nào đó tôi bị thiếu? Nếu nó không phải là một lỗi, lý thuyết hay logic đằng sau nó là gì? Có bất kỳ thực hành an toàn nào về vấn đề này không?
'f (int)' và 'f (const int)' là các nguyên mẫu giống hệt như trình biên dịch ANSI C++ có liên quan – sehe
Đúng, nhưng 'f (int *)' không giống với 'f (const int *)/f (int const *) ' – Roland
Có lẽ. Liên kết: http://stackoverflow.com/questions/2121525/const-pointers-in-overload-resolution/2121616#2121616 – sehe