ฉันคิดไม่ออก:
int main() {
int (*) (int *) = 5;
return 0;
}
การมอบหมายข้างต้นรวบรวมด้วย g ++ c ++ 11 ฉันรู้ว่านั่นint (*) (int *)
เป็นตัวชี้ไปยังฟังก์ชันที่ยอมรับ(int *)
เป็นอาร์กิวเมนต์และส่งกลับค่า int แต่ฉันไม่เข้าใจว่าคุณจะเทียบเคียงเป็น 5 ได้อย่างไรในตอนแรกฉันคิดว่ามันเป็นฟังก์ชันที่คืนค่า 5 อย่างต่อเนื่อง (จากการเรียนรู้ล่าสุดของฉันใน F # น่าจะเป็นฮ่าฮ่า) จากนั้นฉันก็คิดสั้น ๆ ว่าตัวชี้ฟังก์ชันชี้ไปที่ตำแหน่งหน่วยความจำ 5 แต่ไม่ได้ผลชัดเจนและไม่มีค่าฐานสิบหก
คิดว่าอาจเป็นเพราะฟังก์ชันส่งคืน int และการกำหนด int ก็โอเค (อย่างใด) ฉันก็ลองสิ่งนี้ด้วย:
int * (*) (int *) = my_ptr
อยู่ที่ไหนmy_ptr
ประเภทประเภทint *
เดียวกับตัวชี้ฟังก์ชันที่สองนี้เช่นเดียวกับในกรณีแรกที่มีประเภท int สิ่งนี้ไม่ได้รวบรวม การกำหนด 5 หรือค่า int ใด ๆ แทนที่จะmy_ptr
ไม่คอมไพล์สำหรับตัวชี้ฟังก์ชันนี้เช่นกัน
งานมอบหมายหมายความว่าอย่างไร?
อัปเดต 1
เราได้รับการยืนยันว่าเป็นข้อบกพร่องดังที่แสดงไว้ในคำตอบที่ดีที่สุด อย่างไรก็ตามยังไม่ทราบว่าเกิดอะไรขึ้นกับค่าที่คุณกำหนดให้กับตัวชี้ฟังก์ชันหรือเกิดอะไรขึ้นกับการกำหนด คำอธิบายใด ๆ (ที่ดี) เกี่ยวกับเรื่องนี้จะได้รับการชื่นชมมาก! โปรดดูการแก้ไขด้านล่างเพื่อความชัดเจนยิ่งขึ้นเกี่ยวกับปัญหา
แก้ไข 1
ฉันใช้ gcc เวอร์ชัน 4.8.2 (ใน Ubuntu 4.8.2)
แก้ไข 2
อันที่จริงการเทียบเคียงกับทุกสิ่งที่ใช้ได้กับคอมไพเลอร์ของฉัน แม้กระทั่งการเทียบเคียงกับตัวแปร std :: string หรือชื่อฟังก์ชันที่ส่งกลับค่า double ก็ใช้ได้
แก้ไข 2.1
ที่น่าสนใจทำให้ตัวชี้ฟังก์ชันไปยังฟังก์ชันใด ๆ ที่ส่งคืนชนิดข้อมูลที่ไม่ใช่ตัวชี้จะปล่อยให้คอมไพล์เช่น
std::string (*) () = 5.6;
แต่ทันทีที่ตัวชี้ฟังก์ชันไปยังฟังก์ชันที่ส่งกลับตัวชี้บางตัวก็จะไม่คอมไพล์เช่นด้วย
some_data_type ** (*) () = any_value;