การทำเครื่องหมายฟังก์ชั่นconstexpr
ยังทำให้มันเป็นฟังก์ชั่นอินไลน์§ [dcl.constexpr] / 1:
ฟังก์ชั่นหรือสมาชิกข้อมูลคงที่ประกาศด้วยตัวระบุ constexpr เป็นฟังก์ชั่นแบบอินไลน์หรือตัวแปร (7.1.6)
inline
ในทางกลับกันหมายความว่าคุณต้องมีคำจำกัดความของฟังก์ชั่นนั้นในทุกหน่วยการแปลที่อาจใช้ นั่นหมายถึงconstexpr
ฟังก์ชั่นจะต้องเป็นอย่างใดอย่างหนึ่ง:
- จำกัด ให้ใช้ในหนึ่งหน่วยการแปลหรือ
- กำหนดไว้ในส่วนหัว
ฟังก์ชั่นทั่วไปส่วนใหญ่ที่คุณต้องการประกาศในส่วนหัวและกำหนดในไฟล์ต้นฉบับ (และสิ่งอื่น ๆ ที่ใช้พวกเขาเพียงแค่รวมส่วนหัวแล้วเชื่อมโยงกับไฟล์วัตถุของแหล่งที่มา) constexpr
ก็จะไม่ทำงาน
ในทางทฤษฎีแล้วฉันคิดว่าคุณสามารถย้ายทุกอย่างไปยังส่วนหัวและมีไฟล์ต้นฉบับเพียงไฟล์เดียวที่รวมส่วนหัวทั้งหมด แต่สิ่งนี้อาจทำให้เกิดการคอมไพล์ครั้งมากและสำหรับโครงการที่ร้ายแรงที่สุดจะต้องใช้หน่วยความจำจำนวนมาก
constexpr
ฟังก์ชั่นยังถูก จำกัด ในบางวิธีดังนั้นสำหรับฟังก์ชั่นบางอย่างมันอาจจะไม่ได้เป็นตัวเลือกได้เลย ข้อ จำกัด รวมถึง:
- ฟังก์ชั่นเสมือนไม่สามารถเป็น
constexpr
ได้
- ประเภทที่ส่งคืนจะต้องเป็น 'ประเภทตัวอักษร "(เช่นไม่มีวัตถุที่มี ctors หรือ ttors ที่ไม่ใช่ trival)
- พารามิเตอร์ทั้งหมดจะต้องเป็นประเภทตามตัวอักษร
- ฟังก์ชั่นร่างกายไม่สามารถมี
try
บล็อก
- ไม่สามารถมีคำจำกัดความผันแปรของชนิดที่ไม่ใช่ตัวอักษรหรือสิ่งใดก็ตามที่มีระยะเวลาคงที่หรือแบบเธรด
ฉันข้ามไปสองสามอย่างค่อนข้างคลุมเครือสิ่งต่าง ๆ (เช่นมันไม่สามารถมีคำสั่งgoto
หรือasm
) แต่คุณได้รับความคิด - สำหรับบางสิ่งบางอย่างมันไม่ทำงาน
บรรทัดล่าง: ใช่มีหลายสถานการณ์ที่จะเป็นความคิดที่ไม่ดี