คำถามติดแท็ก c++

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

4
ความแตกต่างระหว่าง std :: reference_wrapper และ simple pointer?
ทำไมถึงต้องมีstd::reference_wrapper? ควรใช้ที่ไหน? ต่างจากพอยน์เตอร์ธรรมดาอย่างไร? ประสิทธิภาพของมันเปรียบเทียบกับตัวชี้ธรรมดาอย่างไร?

8
“ argv [0] = name-of-executable” เป็นมาตรฐานที่ยอมรับหรือเป็นเพียงแบบแผนทั่วไป
เมื่อส่งอาร์กิวเมนต์ไปยังmain()แอปพลิเคชัน C หรือ C ++ จะargv[0]เป็นชื่อของไฟล์ปฏิบัติการเสมอ? หรือนี่เป็นเพียงอนุสัญญาทั่วไปและไม่รับประกันว่าจะเป็นจริง 100% ของเวลา?
104 c++  c  standards  argv 

2
std :: shared_ptr ของสิ่งนี้
ขณะนี้ฉันกำลังพยายามเรียนรู้วิธีใช้ตัวชี้อัจฉริยะ อย่างไรก็ตามในขณะที่ทำการทดลองบางอย่างฉันพบสถานการณ์ต่อไปนี้ซึ่งฉันไม่สามารถหาวิธีแก้ปัญหาที่น่าพอใจได้: สมมติว่าคุณมีวัตถุของคลาส A เป็นผู้ปกครองของวัตถุคลาส B (เด็ก) แต่ทั้งสองควรรู้จักกัน: class A; class B; class A { public: void addChild(std::shared_ptr<B> child) { children->push_back(child); // How to do pass the pointer correctly? // child->setParent(this); // wrong // ^^^^ } private: std::list<std::shared_ptr<B>> children; }; class B { public: setParent(std::shared_ptr<A> parent) { this->parent = parent; …

13
ฟังก์ชัน Sequence-zip สำหรับ c ++ 11?
ด้วย range-based ใหม่สำหรับลูปเราสามารถเขียนโค้ดเช่น for(auto x: Y) {} IMO ใดเป็นการปรับปรุงครั้งใหญ่จาก (เช่น) for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {} สามารถใช้เพื่อวนซ้ำสองลูปพร้อมกันเช่นzipฟังก์ชันPythons ได้หรือไม่? สำหรับผู้ที่ไม่คุ้นเคยกับ Python รหัส: Y1 = [1,2,3] Y2 = [4,5,6,7] for x1,x2 in zip(Y1,Y2): print x1,x2 ให้เป็นผลลัพธ์ (1,4) (2,5) (3,6)
104 c++  c++11  sequences 

7
cout, cerr, Clog ของ iostream header ใน c ++ ต่างกันอย่างไร? เมื่อใดควรใช้อันไหน?
ฉันพยายามค้นคว้าความแตกต่างระหว่างcout, cerrและclogบนอินเทอร์เน็ต แต่ไม่สามารถหาคำตอบที่สมบูรณ์ ฉันยังไม่ชัดเจนว่าจะใช้เมื่อใด ใครช่วยอธิบายให้ฉันฟังผ่านโปรแกรมง่ายๆและอธิบายสถานการณ์ที่สมบูรณ์แบบว่าเมื่อใดควรใช้อันไหน ผมเข้าเยี่ยมชมเว็บไซต์นี้ซึ่งแสดงให้เห็นโปรแกรมขนาดเล็กบนcerrและแต่การส่งออกที่ได้รับมากกว่านอกจากนี้ยังสามารถรับใช้clog coutฉันสับสนกับการใช้งานของแต่ละคน
104 c++  iostream  cout  clog 

9
เคยมีการเปลี่ยนแปลงพฤติกรรมเงียบใน C ++ ด้วยเวอร์ชันมาตรฐานใหม่หรือไม่?
(ฉันกำลังมองหาตัวอย่างหรือสองตัวอย่างเพื่อพิสูจน์ประเด็นไม่ใช่รายการ) เคยมีกรณีหรือไม่ที่การเปลี่ยนแปลงในมาตรฐาน C ++ (เช่นจาก 98 เป็น 11, 11 เป็น 14 เป็นต้น) เปลี่ยนพฤติกรรมของรหัสผู้ใช้ที่มีอยู่รูปแบบที่ดีและมีพฤติกรรมที่กำหนด - โดยไม่โต้ตอบ? เช่นไม่มีคำเตือนหรือข้อผิดพลาดเมื่อคอมไพล์กับเวอร์ชันมาตรฐานที่ใหม่กว่า? หมายเหตุ: ฉันกำลังถามเกี่ยวกับพฤติกรรมที่ได้รับคำสั่งตามมาตรฐานไม่ใช่เกี่ยวกับตัวเลือกผู้ดำเนินการ / ผู้เขียนคอมไพเลอร์ ยิ่งสร้างรหัสน้อยเท่าไหร่ก็ยิ่งดี (เป็นคำตอบสำหรับคำถามนี้) ฉันไม่ได้หมายถึงรหัสที่มีการตรวจจับเวอร์ชันเช่น#if __cplusplus >= 201103L. คำตอบเกี่ยวกับโมเดลหน่วยความจำนั้นใช้ได้

2
boost :: flat_map และประสิทธิภาพเมื่อเทียบกับแผนที่และ unordered_map
เป็นความรู้ทั่วไปในการเขียนโปรแกรมว่าตำแหน่งหน่วยความจำช่วยเพิ่มประสิทธิภาพได้มากเนื่องจากแคชฮิต เมื่อเร็ว ๆ นี้ฉันได้ค้นพบเกี่ยวกับboost::flat_mapการใช้งานแผนที่แบบเวกเตอร์ ดูเหมือนจะไม่ได้รับความนิยมเท่าของคุณทั่วไปmap/ unordered_mapดังนั้นฉันจึงไม่สามารถหาการเปรียบเทียบประสิทธิภาพใด ๆ ได้ เปรียบเทียบอย่างไรและอะไรคือกรณีการใช้งานที่ดีที่สุดสำหรับมัน? ขอบคุณ!
103 c++  boost  map 

7
ใน C ++ การคืนเวกเตอร์จากฟังก์ชันยังคงไม่ดีอยู่หรือไม่?
เวอร์ชันสั้น:เป็นเรื่องปกติที่จะส่งคืนวัตถุขนาดใหญ่เช่นเวกเตอร์ / อาร์เรย์ในภาษาโปรแกรมหลายภาษา สไตล์นี้เป็นที่ยอมรับใน C ++ 0x หรือไม่ถ้าคลาสมีตัวสร้างการย้ายหรือโปรแกรมเมอร์ C ++ คิดว่ามันแปลก / น่าเกลียด / น่ารังเกียจหรือไม่? เวอร์ชันยาว:ใน C ++ 0x ยังถือว่าเป็นรูปแบบที่ไม่ดีหรือไม่? std::vector<std::string> BuildLargeVector(); ... std::vector<std::string> v = BuildLargeVector(); เวอร์ชันดั้งเดิมจะมีลักษณะดังนี้: void BuildLargeVector(std::vector<std::string>& result); ... std::vector<std::string> v; BuildLargeVector(v); ในเวอร์ชันที่ใหม่กว่าค่าที่ส่งกลับมาBuildLargeVectorคือ rvalue ดังนั้น v จะถูกสร้างโดยใช้ตัวสร้างการย้ายstd::vectorโดยสมมติว่า (N) RVO ไม่เกิดขึ้น แม้กระทั่งก่อน C ++ 0x รูปแบบแรกมักจะ "มีประสิทธิภาพ" เนื่องจาก …

3
C ++ 14 เพิ่มคีย์เวิร์ดใหม่ใน C ++ หรือไม่
คณะกรรมการมาตรฐาน C ++ มีแนวโน้มที่จะหลีกเลี่ยงการเพิ่มคำหลักใหม่ในภาษา แต่ C ++ 11 นั้นไม่เป็นเช่นนั้น ตัวอย่างบางส่วน: constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas มีคำหลักใหม่ ๆ ที่ใช้กับ C ++ 14 หรือไม่?
103 c++  c++11  keyword  c++14 

4
shared_ptr อยู่ที่ไหน
ตอนนี้ฉันรู้สึกหงุดหงิดมากหลังจากพยายามหาที่ตั้งของ shared_ptr อยู่หลายชั่วโมง ไม่มีตัวอย่างใดที่ฉันเห็นแสดงโค้ดที่สมบูรณ์เพื่อรวมส่วนหัวสำหรับshared_ptr(และใช้งานได้) เพียงแค่ระบุstd, tr1และ<memory>ไม่ได้ช่วยที่ทุกคน! ฉันดาวน์โหลดบูสต์แล้ว แต่ก็ยังไม่ปรากฏ! ใครช่วยบอกทีว่าหาได้ที่ไหน ขอบคุณที่ให้ฉันระบายความผิดหวัง! แก้ไข: ฉันเห็นว่าชื่อของฉันเปลี่ยนไป ขอโทษด้วยกับเรื่องนั้น. ดังนั้น ... มันยังเป็นเพราะฉันไม่ชัดเจนว่า shared_ptr "ขึ้นอยู่กับเวอร์ชัน C ++" -> นั่นเป็นสาเหตุที่ฉันไม่ระบุสภาพแวดล้อมของฉัน -> ดังนั้นจึงเป็นเรื่องยากสำหรับฉันที่จะค้นหามัน ฉันกำลังทำงานกับ MSVS2008 แก้ไข 2: ฉันไม่รู้ว่าทำไม แต่ฉันรวม [memory] และ [boost / tr1 / memory.hpp] และ [boost / tr1 / tr1 / memory] ในขณะที่มองหา shared_ptr ทุกที่ .. แน่นอนฉันทำไม่ได้ …

2
คอมไพเลอร์แสดงสัญลักษณ์ 'pi' เมื่อเกิดข้อผิดพลาด
ฉันกำลังทดสอบโค้ดบางอย่างในColiruและได้ผลลัพธ์แปลก ๆ ฉันลงโค้ดและสามารถสร้างซ้ำได้ด้วยโค้ดง่ายๆนี้: int main() { π } ผลลัพธ์บน g ++: เสียงดัง: ตัวอย่างเช่นการใช้เพียงpi(ไม่มีที่อยู่ของ) จะแสดงผลลัพธ์ที่คาดหวัง: main.cpp:3:5: error: 'pi' was not declared in this scope pi; ^ ฉันพยายามทำซ้ำสิ่งนี้บนเครื่องของฉันโดยใช้ g ++ 4.9.2 และในไซต์อื่น ๆ แต่ไม่สามารถทำได้ นี่คือข้อบกพร่องบางอย่างบนไซต์นี้การกำหนดค่าบางอย่างของคอมไพเลอร์เหล่านี้หรือไม่ แล้วทำไมใช้เฉพาะ address-of operator ( &) เท่านั้นที่แสดงสัญลักษณ์นี้?
103 c++  coliru 

5
รับประกันตลอดอายุการใช้งานชั่วคราวใน C ++?
C ++ รับประกันอายุการใช้งานของตัวแปรชั่วคราวที่สร้างขึ้นภายในการเรียกใช้ฟังก์ชัน แต่ไม่ได้ใช้เป็นพารามิเตอร์หรือไม่ นี่คือคลาสตัวอย่าง: class StringBuffer { public: StringBuffer(std::string & str) : m_str(str) { m_buffer.push_back(0); } ~StringBuffer() { m_str = &m_buffer[0]; } char * Size(int maxlength) { m_buffer.resize(maxlength + 1, 0); return &m_buffer[0]; } private: std::string & m_str; std::vector<char> m_buffer; }; และนี่คือวิธีที่คุณจะใช้: // this is from a crusty old …
103 c++ 

4
ทำไมทุกคนถึงพิมพ์ดีฟมากกว่าประเภท C มาตรฐาน?
หากคุณต้องการที่จะใช้Qtคุณต้องโอบกอดquint8, quint16และอื่น ๆ หากคุณต้องการที่จะใช้GLibคุณต้องยินดีต้อนรับguint8, guint16และอื่น ๆ บนลินุกซ์มีu32, s16และอื่น ๆ UC / OSกำหนดSINT32, UINT16และอื่น ๆ และถ้าคุณต้องใช้สิ่งเหล่านั้นผสมกันคุณควรเตรียมพร้อมสำหรับปัญหา เพราะในเครื่องของคุณu32จะได้รับtypedefวันที่มากกว่าlongและquint32จะได้รับtypedefวันที่มากกว่าintและคอมไพเลอร์จะบ่น ทำไมทุกคนถึงทำเช่นนี้ถ้ามี<stdint.h>? นี่เป็นประเพณีสำหรับห้องสมุดหรือไม่?
103 c++  c  stdint 

6
__gxx_personality_v0 คืออะไร?
นี่เป็นคำถามมือสองจากไซต์การพัฒนาระบบปฏิบัติการ แต่มันทำให้ฉันสงสัยเพราะฉันไม่สามารถหาคำอธิบายที่ดีได้จากที่ใด เมื่อรวบรวมและเชื่อมโยงโปรแกรม C ++ แบบอิสระโดยใช้ gcc บางครั้งข้อผิดพลาดของตัวเชื่อมโยงเช่นนี้จะเกิดขึ้น: out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' เห็นได้ชัดว่าเป็นเพราะสัญลักษณ์นี้ถูกกำหนดใน libstdc ++ ซึ่งขาดหายไปในสภาพแวดล้อมอิสระ การแก้ไขปัญหาเพียงแค่กำหนดสัญลักษณ์นี้ไว้ที่ใดที่หนึ่ง: void *__gxx_personality_v0; ซึ่งดี แต่ฉันไม่ชอบสิ่งที่ใช้งานได้อย่างมหัศจรรย์ ... คำถามคือจุดประสงค์ของสัญลักษณ์นี้คืออะไร?
103 c++  gcc  linker  kernel 

12
เหตุใดตัวอักษรตัวอักษร C จึงอยู่ภายในแทนอักขระ
ใน C sizeof('a') == sizeof(char) == 1++, สิ่งนี้ทำให้เข้าใจง่ายเนื่องจาก'a'เป็นอักขระตามตัวอักษรและsizeof(char) == 1ตามที่กำหนดโดยมาตรฐาน ใน C อย่างไรก็ตามsizeof('a') == sizeof(int). นั่นคือดูเหมือนว่าอักษรตัวอักษร C เป็นจำนวนเต็ม มีใครรู้บ้างว่าทำไม? ฉันสามารถค้นหาการกล่าวถึง C quirk นี้ได้มากมาย แต่ไม่มีคำอธิบายว่าเหตุใดจึงมีอยู่
103 c++  c  char  sizeof 

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