มีเพียงไม่กี่ชิ้นเท่านั้นที่ทำให้ชุดค่าผสมทั้งหมดเหล่านี้ทำงานเหมือนกัน
เหตุผลพื้นฐานว่าทำไมงานเหล่านี้ทั้งหมดคือฟังก์ชัน (เช่นfoo
) สามารถแปลงเป็นตัวชี้ไปยังฟังก์ชันโดยปริยาย นี่คือเหตุผลที่void (*p1_foo)() = foo;
ผลงาน: จะถูกแปลงโดยปริยายเข้าไปในตัวชี้ไปที่ตัวเองและตัวชี้ที่กำหนดให้foo
p1_foo
unary &
เมื่อนำไปใช้กับฟังก์ชั่นจะให้ตัวชี้ไปยังฟังก์ชันเช่นเดียวกับที่มันให้ที่อยู่ของวัตถุเมื่อนำไปใช้กับวัตถุ สำหรับพอยน์เตอร์ไปยังฟังก์ชั่นทั่วไปมันจะซ้ำซ้อนเสมอเนื่องจากการแปลงฟังก์ชันไปเป็นฟังก์ชั่นตัวชี้โดยนัย ในกรณีใด ๆ นี่คือเหตุผลที่void (*p3_foo)() = &foo;
ทำงาน
unary *
เมื่อนำไปใช้กับตัวชี้ฟังก์ชั่นให้ผลตอบแทนฟังก์ชั่นชี้ไปที่เช่นเดียวกับมันให้ผลผลิตวัตถุชี้ไปที่เมื่อมันถูกนำไปใช้กับตัวชี้ธรรมดาไปยังวัตถุ
กฎเหล่านี้สามารถรวมกันได้ ลองพิจารณาตัวอย่างที่สองถึงล่าสุดของคุณ**foo
:
- อันดับแรก
foo
จะถูกแปลงเป็นตัวชี้ไปยังตัวเองโดยปริยายและตัวแรก*
จะถูกนำไปใช้กับตัวชี้ฟังก์ชั่นนั้นโดยยอมให้ฟังก์ชั่นfoo
อีกครั้ง
- แล้วผลที่ตามมาเป็นอีกครั้งโดยปริยายแปลงเป็นตัวชี้ไปที่ตัวเองและครั้งที่สองถูกนำไปใช้อีกครั้งยอมฟังก์ชั่น
*
foo
- จากนั้นจะถูกแปลงเป็นตัวชี้ฟังก์ชันอีกครั้งโดยปริยายและกำหนดให้กับตัวแปร
คุณสามารถเพิ่มได้มาก*
เท่าที่คุณต้องการผลลัพธ์จะเหมือนเดิมเสมอ ยิ่ง*
s, merrier
เราสามารถพิจารณาตัวอย่างที่ห้าของคุณ&*foo
:
- ก่อน
foo
จะถูกแปลงเป็นตัวชี้ไปยังตัวเองโดยปริยาย *
จะนำมาใช้กับ unary และให้ผลfoo
อีกครั้ง
- จากนั้น
&
จะนำไปใช้foo
โดยยอมให้ตัวชี้ไปยังfoo
ซึ่งถูกกำหนดให้กับตัวแปร
&
เท่านั้นที่สามารถนำไปใช้กับการทำงานแม้ว่าจะไม่ฟังก์ชั่นที่ได้รับการแปลงเป็นตัวชี้ฟังก์ชั่น (เว้นแต่ของหลักสูตรตัวชี้ฟังก์ชั่นเป็นตัวแปรซึ่งในกรณีนี้ผลที่ได้คือตัวชี้ไป-a-pointer- to-a-function ตัวอย่างเช่นคุณสามารถเพิ่มในรายการของคุณvoid (**pp_foo)() = &p7_foo;
)
นี่คือเหตุผลที่&&foo
ไม่ทำงาน: &foo
ไม่ใช่ฟังก์ชั่น; มันเป็นตัวชี้ฟังก์ชั่นที่เป็น rvalue อย่างไรก็ตาม&*&*&*&*&*&*foo
จะได้ผลเหมือน&******&foo
กันเพราะในทั้งสองนิพจน์&
นั้นจะใช้กับฟังก์ชันเสมอและไม่ใช้กับตัวชี้ฟังก์ชัน rvalue
โปรดทราบว่าคุณไม่จำเป็นต้องใช้เอกภาพ*
เพื่อทำการโทรผ่านตัวชี้ฟังก์ชั่น ทั้งสอง(*p1_foo)();
และ(p1_foo)();
มีผลลัพธ์เหมือนกันอีกครั้งเนื่องจากการแปลงฟังก์ชันเป็นตัวชี้ฟังก์ชัน
&foo
ใช้ที่อยู่ของfoo
ซึ่งส่งผลให้ตัวชี้ฟังก์ชั่นชี้ไปที่foo
อย่างที่คาดหวัง