Trong đoạn mã dưới đây, hàm con trỏ và những gì tôi coi là "chức năng tham khảo" dường như có ngữ nghĩa giống hệt nhau:con trỏ hàm vs tham khảo Function
#include <iostream>
using std::cout;
void func(int a) {
cout << "Hello" << a << '\n';
}
void func2(int a) {
cout << "Hi" << a << '\n';
}
int main() {
void (& f_ref)(int) = func;
void (* f_ptr)(int) = func;
// what i expected to be, and is, correct:
f_ref(1);
(*f_ptr)(2);
// what i expected to be, and is not, wrong:
(*f_ref)(4); // i even added more stars here like (****f_ref)(4)
f_ptr(3); // everything just works!
// all 4 statements above works just fine
// the only difference i found, as one would expect:
// f_ref = func2; // ERROR: read-only reference
f_ptr = func2; // works fine!
f_ptr(5);
return 0;
}
tôi đã sử dụng gcc phiên bản 4.7.2 trong Fedora/Linux
CẬP NHẬT
câu hỏi của tôi là:
Tại sao con trỏ hàm không yêu cầu dereferencing?Tại sao dereferencing tham chiếu hàm không dẫn đến lỗi?- Có (Có) có bất kỳ tình huống nào mà tôi phải sử dụng cái này qua người khác không?
- Tại sao
f_ptr = &func;
hoạt động? Vì func nên được phân rã thành một con trỏ?
Trong khif_ptr = &&func;
không hoạt động (chuyển đổi ngầm từvoid *
)
là lỗi triển khai? 'coz mà đi ngược lại các khái niệm trực quan của chúng ta về "đánh máy", phải không? Tôi cũng đã nhìn thấy một cái gì đó như 'void (* & f) (void)' như là một tham số để chức năng - '*' và '&' được sử dụng cùng nhau .. làm thế nào đến? – John
Nó không phải là một lỗi, chỉ là cách ngôn ngữ được xác định. Trong các biểu thức, về cơ bản không có hàm, chỉ có các con trỏ hàm; phân rã chăm sóc làm cho cú pháp "rõ ràng" hoạt động (tức là bạn có thể gõ 'f (1)' thay vì 'cồng kềnh' (& f) (1) '). –
@John: So sánh với cách mảng được xử lý; chúng _can't_ được truyền bởi giá trị, vì vậy trong một prototype mẫu, 'int x []' (và cho rằng vấn đề ('int x [10]') tương đương với 'int * x'; vì nhận được một mảng C bởi giá trị không hợp lệ, chúng cho phép cú pháp khai báo mảng được sử dụng như cú pháp đường để nhận con trỏ. – ShadowRanger