std :: is_function ใช้งานอย่างไร?


82

การดำเนินการต่อไปนี้เป็นstd::is_functionอย่างไร

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

(จากการอ้างอิง CPP )

ดูเหมือนว่าฉันintจะเป็นฟังก์ชั่นภายใต้คำจำกัดความนี้ ฉันกำลังคิดถึงอะไร


10
คิดถึง!is_constส่วนนี้
aschepler

ทำไมประเภทฟังก์ชั่นไม่สามารถเป็น const ได้? สิ่งนี้เกี่ยวข้องกับประเภทที่น่ารังเกียจหรือไม่?
jtbandes

4
@ jtbandes เนื่องจากฟังก์ชั่นเป็นหนึ่งในบางสิ่งใน C ++ ที่ไม่ใช่วัตถุ
Ayxan

1
ฉันเดาว่าเพราะในความจริงแล้วมันเป็นเรื่องปกติเสมอ
RiaD

ฉันรู้สึกว่าชื่อมีความเข้าใจผิด "นี่เป็นการใช้งาน std :: is_function ที่ถูกต้องได้อย่างไร" ดูเหมือนจะเหมาะสมกว่า
วาลพูดว่า Reinstate Monica

คำตอบ:


73

ลองดูเงื่อนไขที่ปรากฏ:
ถ้าconst Tไม่ใช่ const (ใช้constไม่ได้จริงกับประเภทฟังก์ชั่นเนื่องจากฟังก์ชั่นไม่ใช่วัตถุ) และTไม่ใช่การอ้างอิง ( constใช้ไม่ได้กับการอ้างอิงด้วยเหตุผลเดียวกัน) มันเป็นประเภทฟังก์ชั่น int(หรือพิมพ์ไม่ได้ฟังก์ชั่นที่ไม่ได้อ้างอิงอื่น ๆ ) จะไม่พอดีเพราะเป็นis_const<const int>::valuetrue

ตามมาตรฐาน C ++ 17 §11.3.5ฟังก์ชั่น / ส่วนที่ 7 : (เหมืองเน้น)

ผลกระทบของ cv-qualifier-seq ใน function declarator นั้นไม่เหมือนกับการเพิ่ม cv-qualification ด้านบนของประเภทฟังก์ชัน ในกรณีหลัง cv-qualifier จะถูกละเว้น [หมายเหตุ: ประเภทฟังก์ชั่นที่มี cv-qualifier-seq ไม่ใช่ประเภทที่ผ่านการรับรอง cv; ไม่มีประเภทฟังก์ชันที่ผ่านการรับรอง cv - ท้ายบันทึก] [... ]


5
อ่า .... ฉันไม่มี "const" ในส่วน is_const ของอันนี้ นั่นทำให้รู้สึก
Rian Quinn

54

มีเพียงสองประเภทประเภทในภาษาที่ไม่สามารถมีการรับรองคุณสมบัติ: ประเภทการอ้างอิงและประเภทฟังก์ชั่น ดังนั้นหากconst Tล้มเหลวในการเป็นประเภทที่ผ่านการรับรองหมายความว่าTเป็นประเภทฟังก์ชั่นหรือประเภทอ้างอิง หากคุณสามารถแยกประเภทการอ้างอิงออกได้แสดงว่าคุณเหลือ แต่เพียงฟังก์ชันประเภทเท่านั้น

โปรดทราบว่าประเภทฟังก์ชั่นที่มี cv-qualifier เช่นint(int) constนั้นไม่ใช่ประเภทที่ผ่านการรับรอง มันเป็นตัวอย่างของ "ประเภทฟังก์ชั่นที่น่ารังเกียจ" ซึ่งมีเพียงการใช้งานจริงคือการเขียนหรือแยกประเภทตัวชี้ไปยังสมาชิกฟังก์ชัน ชนิดที่int(int) constไม่สามารถหาได้โดยการเพิ่ม const int(int)วุฒิการศึกษาด้านบนของ ค่อนข้างconstนำไปใช้กับพารามิเตอร์วัตถุโดยนัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.