คำถามติดแท็ก initializer-list

10
ข้อผิดพลาดในการคอมไพล์ C:“ อ็อบเจ็กต์ขนาดตัวแปรอาจไม่สามารถเริ่มต้นได้”
เหตุใดฉันจึงได้รับข้อผิดพลาด "Variable-sized object may not be initialized" พร้อมรหัสต่อไปนี้ int boardAux[length][length] = {{0}};

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 …

8
initializer_list และย้ายความหมาย
ฉันได้รับอนุญาตให้ย้ายองค์ประกอบออกจากไฟล์ std::initializer_list<T> ? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } เนื่องจากstd::intializer_list<T>ต้องการความสนใจของคอมไพเลอร์เป็นพิเศษและไม่มีค่าความหมายเหมือนคอนเทนเนอร์ปกติของไลบรารีมาตรฐาน C ++ ฉันควรจะปลอดภัยดีกว่าขอโทษและถาม

5
ฉันสามารถแสดงรายการ - เริ่มต้นเวกเตอร์ประเภทย้ายอย่างเดียวได้หรือไม่
ถ้าฉันส่งรหัสต่อไปนี้ผ่านสแนปชอต GCC 4.7 ของฉันมันจะพยายามคัดลอกunique_ptrs ลงในเวกเตอร์ #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } เห็นได้ชัดว่าไม่สามารถทำงานได้เนื่องจากstd::unique_ptrไม่สามารถคัดลอกได้: ข้อผิดพลาด: การใช้ฟังก์ชันที่ถูกลบ 'std :: unique_ptr <_Tp, _Dp> :: unique_ptr (const std :: unique_ptr <_Tp, _Dp> &) [ด้วย _Tp = int; _Dp = std :: default_delete; …

6
เหตุใด std :: initializer_list จึงไม่เป็นภาษาในตัว
เหตุใดจึงไม่มีstd::initializer_listภาษาหลักในตัว สำหรับฉันแล้วดูเหมือนว่ามันเป็นคุณสมบัติที่สำคัญของ C ++ 11 แต่ก็ไม่มีคำหลักที่สงวนไว้ (หรือบางอย่างที่เหมือนกัน) แต่initializer_listเป็นเพียงคลาสเทมเพลตจากไลบรารีมาตรฐานที่มีการแมปพิเศษโดยนัยจากไวยากรณ์รายการวงเล็บปีกกา ใหม่{...}ที่คอมไพเลอร์จัดการ ตอนแรกคิดว่าโซลูชันนี้ค่อนข้างแฮ็ค นี่เป็นวิธีการใช้งานส่วนเพิ่มเติมใหม่ในภาษา C ++: โดยบทบาทโดยปริยายของคลาสเทมเพลตบางคลาสไม่ใช่ภาษาหลักหรือไม่? โปรดพิจารณาตัวอย่างเหล่านี้: widget<int> w = {1,2,3}; //this is how we want to use a class เหตุใดจึงเลือกคลาสใหม่: widget( std::initializer_list<T> init ) แทนที่จะใช้สิ่งที่คล้ายกับแนวคิดเหล่านี้: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> …

3
เมื่อใดควรใช้ตัวเริ่มต้นที่ปิดด้วยปีกกา
ใน C ++ 11 เรามีไวยากรณ์ใหม่สำหรับการเริ่มต้นคลาสซึ่งทำให้เรามีความเป็นไปได้มากมายในการเริ่มต้นตัวแปร { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string …

2
std :: map ขยายรายการ initializer จะเป็นอย่างไร
หากมีอยู่std::mapรายการเริ่มต้นเพิ่มเติมจะมีลักษณะอย่างไร ฉันได้ลองใช้ชุดค่าผสมของ ... ทุกอย่างที่ฉันคิดได้ด้วย GCC 4.4 แต่ไม่พบสิ่งใดที่รวบรวมได้

3
เริ่มต้นสมาชิกคลาสคงที่หลายคนโดยใช้การเรียกฟังก์ชันหนึ่ง C ++
หากฉันมีตัวแปรสมาชิกคงที่แตกต่างกันสองตัวซึ่งทั้งสองต้องเริ่มต้นใหม่โดยใช้การเรียกฟังก์ชันเดียวกันมีวิธีการทำเช่นนี้โดยไม่ต้องเรียกใช้ฟังก์ชันสองครั้งหรือไม่ ตัวอย่างเช่นคลาสเศษส่วนที่ตัวเศษและตัวหารเป็นค่าคงที่ int gcd(int a, int b); // Greatest Common Divisor class Fraction { public: // Lets say we want to initialize to a reduced fraction Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b)) { } private: const int numerator, denominator; }; ส่งผลให้เสียเวลาเนื่องจากฟังก์ชั่น GCD ถูกเรียกสองครั้ง คุณสามารถกำหนดสมาชิกคลาสใหม่gcd_a_bและก่อนกำหนดเอาต์พุตของ gcd ให้กับรายการนั้นในรายการ initializer แต่สิ่งนี้จะนำไปสู่การสูญเสียความจำ โดยทั่วไปแล้วมีวิธีการทำเช่นนี้โดยไม่ต้องใช้ฟังก์ชั่นการโทรหรือหน่วยความจำที่สูญเปล่า …

6
ช่วงไร้เดียงสาที่ใช้สำหรับลูปไม่ทำงาน
ต่อไปนี้ไม่ได้รวบรวม: #include <iostream> int main() { int a{},b{},c{},d{}; for (auto& s : {a, b, c, d}) { s = 1; } std::cout << a << std::endl; return 0; } ลองใช้กับ godbolt ข้อผิดพลาดของคอมไพเลอร์คือ: error: assignment of read-only reference 's' ตอนนี้ในกรณีของฉันจริงรายการทำจากตัวแปรสมาชิกในชั้นเรียน ทีนี้มันไม่ได้ผลเพราะนิพจน์กลายเป็นinitializer_list<int>สิ่งที่คัดลอก a, b, c และ d - ดังนั้นจึงไม่อนุญาตให้ทำการดัดแปลง คำถามของฉันคือสองเท่า: มีแรงจูงใจเบื้องหลังที่ไม่ยอมให้เขียนช่วงสำหรับลูปด้วยวิธีนี้หรือไม่? เช่น. …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.