ก่อน C ++ 11 เราสามารถดำเนินการเริ่มต้นในคลาสเฉพาะกับสมาชิก const คงที่ของประเภทอินทิกรัลหรือการแจงนับ Stroustrup กล่าวถึงสิ่งนี้ในคำถามที่พบบ่อยเกี่ยวกับ C ++โดยให้ตัวอย่างต่อไปนี้:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
และเหตุผลต่อไปนี้:
เหตุใดจึงมีข้อ จำกัด ที่ไม่สะดวกเหล่านี้? โดยทั่วไปคลาสจะถูกประกาศในไฟล์ส่วนหัวและโดยทั่วไปไฟล์ส่วนหัวจะรวมอยู่ในหน่วยการแปลจำนวนมาก อย่างไรก็ตามเพื่อหลีกเลี่ยงกฎตัวเชื่อมโยงที่ซับซ้อน C ++ ต้องการให้ทุกออบเจ็กต์มีนิยามเฉพาะ กฎนั้นจะเสียหาก C ++ อนุญาตให้มีการกำหนดเอนทิตีในคลาสที่จำเป็นต้องเก็บไว้ในหน่วยความจำเป็นวัตถุ
อย่างไรก็ตาม C ++ 11 ผ่อนคลายข้อ จำกัด เหล่านี้ทำให้สามารถเริ่มต้นในคลาสของสมาชิกที่ไม่คงที่ (§12.6.2 / 8):
ในคอนสตรัคเตอร์ที่ไม่ใช่การมอบหมายหากสมาชิกข้อมูลที่ไม่คงที่หรือคลาสพื้นฐานไม่ได้กำหนดโดยmem-initializer-id (รวมถึงกรณีที่ไม่มีmem-initializer-listเนื่องจากตัวสร้างไม่มีctor-initializer ) และเอนทิตีไม่ใช่คลาสพื้นฐานเสมือนของคลาสนามธรรม (10.4) ดังนั้น
- ถ้าเอนทิตีเป็นสมาชิกข้อมูลที่ไม่คงที่ที่มีตัวเริ่มต้นแบบรั้งหรือเท่ากับค่าเริ่มต้นเอนทิตีจะถูกเตรียมใช้งานตามที่ระบุใน 8.5
- มิฉะนั้นหากเอนทิตีเป็นสมาชิกตัวแปร (9.5) จะไม่มีการเตรียมใช้งาน
- มิฉะนั้นเอนทิตีเป็นค่าเริ่มต้นเริ่มต้น (8.5)
ส่วน 9.4.2 ยังอนุญาตให้เริ่มต้นในคลาสของสมาชิกคงที่ที่ไม่ใช่ const หากมีการทำเครื่องหมายด้วยตัวconstexpr
ระบุ
แล้วเกิดอะไรขึ้นกับสาเหตุของข้อ จำกัด ที่เรามีใน C ++ 03? เราเพียงแค่ยอมรับ "กฎตัวเชื่อมโยงที่ซับซ้อน" หรือมีการเปลี่ยนแปลงอย่างอื่นที่ทำให้ใช้งานได้ง่ายขึ้น?