Tôi không thể hình này ra:
int main() {
int (*) (int *) = 5;
return 0;
}
Bài tập trên biên dịch với g ++ c ++ 11. Tôi biết rằng đó int (*) (int *)
là một con trỏ đến một hàm chấp nhận một (int *)
đối số là và trả về một int, nhưng tôi không hiểu làm thế nào bạn có thể đánh đồng nó với 5. Lúc đầu, tôi nghĩ đó là một hàm liên tục trả về 5 (từ bài học gần đây của tôi trong F #, có thể là, haha), sau đó tôi nghĩ ngắn gọn rằng con trỏ hàm trỏ đến vị trí bộ nhớ 5, nhưng điều đó không hoạt động, rõ ràng và các giá trị hex cũng vậy.
Nghĩ rằng có thể là do hàm trả về một int và việc gán một int là ok (bằng cách nào đó), tôi cũng đã thử điều này:
int * (*) (int *) = my_ptr
ở đâu my_ptr
là kiểu int *
, cùng kiểu với con trỏ hàm thứ hai này, như trong trường hợp đầu tiên với kiểu int. Điều này không biên dịch. Việc gán 5 hoặc bất kỳ giá trị int nào thay vì my_ptr
cũng không biên dịch cho con trỏ hàm này.
Vậy bài tập nghĩa là gì?
Cập nhật 1
Chúng tôi xác nhận rằng đó là một lỗi, như được hiển thị trong câu trả lời tốt nhất. Tuy nhiên, vẫn chưa biết điều gì thực sự xảy ra với giá trị mà bạn gán cho con trỏ hàm hoặc điều gì xảy ra với việc gán. Bất kỳ giải thích (tốt) nào về điều đó sẽ được đánh giá rất cao! Vui lòng tham khảo các chỉnh sửa bên dưới để rõ hơn về vấn đề.
Chỉnh sửa 1
Tôi đang sử dụng gcc phiên bản 4.8.2 (trong Ubuntu 4.8.2)
Chỉnh sửa 2
Trên thực tế, đánh đồng nó với bất kỳ thứ gì hoạt động trên trình biên dịch của tôi. Ngay cả khi đánh đồng nó với một biến std :: string hoặc một tên hàm trả về một giá trị kép cũng hoạt động.
Chỉnh sửa 2.1
Điều thú vị là, việc biến nó thành một con trỏ hàm tới bất kỳ hàm nào trả về kiểu dữ liệu không phải là con trỏ, sẽ cho phép nó biên dịch, chẳng hạn như
std::string (*) () = 5.6;
Nhưng ngay sau khi con trỏ hàm đến một hàm trả về một số con trỏ, nó không biên dịch, chẳng hạn như với
some_data_type ** (*) () = any_value;