คำถามติดแท็ก aggregate-initialization

6
การเริ่มต้นอาร์เรย์สมาชิกในตัวสร้างเริ่มต้น
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; ฉันเชื่อว่าเหตุผลคืออาร์เรย์สามารถเริ่มต้นด้วย=ไวยากรณ์เท่านั้นนั่นคือ: int arr[3] = {1,3,4}; คำถาม ฉันจะทำสิ่งที่ต้องการได้อย่างไร (นั่นคือเริ่มต้นอาร์เรย์ในตัวสร้าง (ไม่ได้กำหนดองค์ประกอบในเนื้อความ)) เป็นไปได้หรือไม่? มาตรฐาน C ++ 03 พูดอะไรเป็นพิเศษเกี่ยวกับการเริ่มต้นการรวม (รวมถึงอาร์เรย์) ใน ctor initializers หรือไม่ หรือความไม่ถูกต้องของรหัสข้างต้นเป็นข้อพิสูจน์ของกฎอื่น ๆ ? รายการเริ่มต้น C ++ 0x …

3
คอนสตรัคเตอร์ส่วนตัวไม่ใช่คอนสตรัคเตอร์ส่วนตัวเมื่อใด
สมมติว่าฉันมีประเภทและฉันต้องการทำให้ตัวสร้างเริ่มต้นเป็นแบบส่วนตัว ฉันเขียนสิ่งต่อไปนี้: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); …

8
การ จำกัด การแปลงใน C ++ 0x มันเป็นแค่ตัวฉันเองหรือนี่ฟังดูเหมือนเป็นการเปลี่ยนแปลงอย่างสิ้นเชิง?
C ++ 0x จะสร้างโค้ดต่อไปนี้และโค้ดที่คล้ายกันมีรูปแบบไม่ถูกต้องเนื่องจากต้องมีการแปลงที่เรียกว่าการแปลง a doubleเป็นint. int a[] = { 1.0 }; ฉันสงสัยว่าการเริ่มต้นประเภทนี้ใช้มากในรหัสโลกแห่งความเป็นจริงหรือไม่ การเปลี่ยนแปลงนี้จะเสียรหัสกี่รหัส การแก้ไขในโค้ดของคุณมีความพยายามมากหรือไม่หากโค้ดของคุณได้รับผลกระทบเลย สำหรับการอ้างอิงโปรดดูที่ 8.5.4 / 6 ของ n3225 Conversion ที่แคบลงคือการแปลงโดยปริยาย จากประเภททศนิยมไปยังประเภทจำนวนเต็มหรือ จาก long double ไปเป็น double หรือ float หรือจาก double ไปจนถึง float ยกเว้นที่มาคือนิพจน์คงที่และมูลค่าที่แท้จริงหลังการแปลงอยู่ในช่วงของค่าที่สามารถแสดงได้ (แม้ว่าจะไม่สามารถแสดงได้อย่างแน่นอน) หรือ จากประเภทจำนวนเต็มหรือประเภทการแจงนับที่ไม่ได้กำหนดขอบเขตเป็นประเภทจุด oating ยกเว้นที่มาเป็นนิพจน์คงที่และมูลค่าที่แท้จริงหลังจากการแปลงจะพอดีกับประเภทเป้าหมายและจะให้ค่าเดิมเมื่อแปลงกลับเป็นประเภทเดิมหรือ จากประเภทจำนวนเต็มหรือประเภทการแจงนับที่ไม่ได้กำหนดขอบเขตไปเป็นประเภทจำนวนเต็มที่ไม่สามารถแสดงค่าทั้งหมดของประเภทเดิมได้ยกเว้นที่มาเป็นนิพจน์คงที่และมูลค่าจริงหลังจากการแปลงจะพอดีกับประเภทเป้าหมายและจะสร้างค่าดั้งเดิมเมื่อ แปลงกลับเป็นประเภทเดิม

5
เป็นไปได้หรือไม่ที่จะป้องกันไม่ให้สมาชิกเริ่มต้นรวม?
ฉันมีโครงสร้างที่มีสมาชิกประเภทเดียวกันหลายคนเช่นนี้ struct VariablePointers { VariablePtr active; VariablePtr wasactive; VariablePtr filename; }; ปัญหาคือถ้าฉันลืมที่จะเริ่มต้นหนึ่งในสมาชิก struct (เช่นwasactive) เช่นนี้ VariablePointers{activePtr, filename} คอมไพเลอร์จะไม่บ่นเกี่ยวกับมัน แต่ฉันจะมีหนึ่งวัตถุที่เริ่มต้นได้เพียงบางส่วน ฉันจะป้องกันข้อผิดพลาดประเภทนี้ได้อย่างไร ฉันสามารถเพิ่มนวกรรมิกได้ แต่มันจะทำซ้ำรายการตัวแปรสองครั้งดังนั้นฉันต้องพิมพ์ทั้งหมดสามครั้งนี้! โปรดเพิ่มคำตอบC ++ 11หากมีวิธีแก้ปัญหาสำหรับ C ++ 11 (ขณะนี้ฉัน จำกัด เฉพาะรุ่นนั้น) อีกทั้งมาตรฐานภาษาล่าสุดก็ยินดีต้อนรับเช่นกัน!

4
ซ่อนคลาสฐานที่ว่างเปล่าสำหรับการเริ่มต้นรวม
พิจารณารหัสต่อไปนี้: struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } นี่คือวิธีที่คุณต้องเริ่มต้น B: B<int, 3> b = { {}, {1, 2, 3} }; ฉันต้องการหลีกเลี่ยงการว่าง {} ที่ไม่จำเป็นสำหรับคลาสฐาน มีวิธีแก้ปัญหาที่เสนอโดย Jarod42 ที่นี่แต่มันไม่ทำงานกับองค์ประกอบการเริ่มต้นองค์ประกอบ: B<int, 3> b = {1, 2, 3};ดี แต่B<int, 3> b …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.