Khi bạn viết int fun2(int fun())
, tham số int fun()
chuyển đổi thành int (*fun)()
, nó trở nên chính xác tương đương như sau:
int fun2(int (*fun)());
Chuyển đổi famiiar hơn xảy ra trong trường hợp của mảng khi bạn khai báo nó như là tham số chức năng. Ví dụ, nếu bạn đã này:
int f(int a[100]);
Thậm chí ở đây các loại tham số chuyển đổi thành int*
, và nó trở thành này:
int f(int *a);
Lý do tại sao loại chức năng và kiểu mảng chuyển đổi thành chức năng con trỏ loại và kiểu con trỏ, tương ứng, là vì tiêu chuẩn không cho phép hàm và mảng được chuyển đến hàm, bạn cũng không thể trả về hàm và mảng từ hàm. Trong cả hai trường hợp, chúng phân rã thành phiên bản con trỏ của chúng.
Tiêu chuẩn C++ 03 nói trong §13.1/3 (và nó là giống trong C++ 11 cũng),
tờ khai Parameter mà chỉ khác nhau ở một trong đó là một loại chức năng và người kia là con trỏ tới cùng một loại hàm là tương đương. Tức là, loại chức năng được điều chỉnh để trở thành con trỏ thành kiểu hàm (8.3.5).
Và một cuộc thảo luận thú vị hơn là ở đây:
Hợp lệ trong C, C99 Nghiêm ngặt, C++ 03 và C++ 11. Và tôi ngạc nhiên. –