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

6
std :: unique_ptr ด้วยประเภทที่ไม่สมบูรณ์จะไม่รวบรวม
ฉันใช้ pimpl-idiom กับstd::unique_ptr: class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile }; อย่างไรก็ตามฉันได้รับข้อผิดพลาดในการคอมไพล์เกี่ยวกับการใช้ประเภทที่ไม่สมบูรณ์ในบรรทัด 304 ใน<memory>: แอปพลิเคชันไม่ถูกต้องของ ' sizeof' เป็นประเภทไม่สมบูรณ์ ' uixx::window::window_impl' เท่าที่ฉันรู้std::unique_ptrควรใช้กับประเภทที่ไม่สมบูรณ์ นี่เป็นข้อบกพร่องใน libc ++ หรือฉันทำอะไรผิดที่นี่?

2
กลไกของการเพิ่มประสิทธิภาพสตริงสั้นใน libc ++ คืออะไร?
คำตอบนี้ให้ภาพรวมระดับสูงที่ดีของการเพิ่มประสิทธิภาพสตริงสั้น (SSO) อย่างไรก็ตามฉันต้องการทราบรายละเอียดเพิ่มเติมว่ามันทำงานอย่างไรในทางปฏิบัติโดยเฉพาะในการใช้งาน libc ++: สตริงต้องสั้นแค่ไหนจึงจะมีคุณสมบัติเป็น SSO สิ่งนี้ขึ้นอยู่กับสถาปัตยกรรมเป้าหมายหรือไม่? การใช้งานแยกความแตกต่างระหว่างสตริงแบบสั้นและแบบยาวเมื่อเข้าถึงข้อมูลสตริงอย่างไร มันง่ายเหมือนm_size <= 16หรือเป็นแฟล็กที่เป็นส่วนหนึ่งของตัวแปรสมาชิกอื่น ๆ หรือไม่? (ฉันคิดว่าm_sizeหรือบางส่วนอาจใช้ในการจัดเก็บข้อมูลสตริง) ผมถามคำถามนี้มาโดยเฉพาะสำหรับ libc ++ เพราะฉันรู้ว่ามันใช้ SSO นี้ถูกกล่าวถึงแม้ในlibc ++ หน้าแรก นี่คือข้อสังเกตบางประการหลังจากดูที่มา : libc ++ สามารถคอมไพล์โดยมีเลย์เอาต์หน่วยความจำที่แตกต่างกันเล็กน้อยสำหรับคลาสสตริงซึ่งถูกควบคุมโดย_LIBCPP_ALTERNATE_STRING_LAYOUTแฟล็ก เค้าโครงทั้งสองยังแยกความแตกต่างระหว่างเครื่องจักรเล็ก ๆ น้อย ๆ และเครื่องใหญ่เอนด์เซียนซึ่งทำให้เรามีรูปแบบต่างๆทั้งหมด 4 แบบ ฉันจะถือว่าเค้าโครง "ปกติ" และ endian น้อยในสิ่งต่อไปนี้ สมมติว่าต่อไปsize_typeคือ 4 ไบต์และนั่นvalue_typeคือ 1 ไบต์นี่คือลักษณะของสตริง 4 ไบต์แรกในหน่วยความจำ: // short string: …

1
เหตุใดเวกเตอร์ <bool> ของ libc ++ :: const_reference จึงไม่ใช่บูล
มาตรา 23.3.7 คลาสvector&lt;bool&gt;[vector.bool] วรรค 1 ระบุ: template &lt;class Allocator&gt; class vector&lt;bool, Allocator&gt; { public: // types: typedef bool const_reference; ... อย่างไรก็ตามโปรแกรมนี้ไม่สามารถคอมไพล์เมื่อใช้ libc ++: #include &lt;vector&gt; #include &lt;type_traits&gt; int main() { static_assert(std::is_same&lt;std::vector&lt;bool&gt;::const_reference, bool&gt;{}, "?"); } นอกจากนี้ฉันทราบว่ามาตรฐาน C ++ มีความสอดคล้องกันในข้อกำหนดนี้ตลอดไปจนถึง C ++ 98 และฉันทราบเพิ่มเติมว่า libc ++ ไม่ได้ปฏิบัติตามข้อกำหนดนี้อย่างต่อเนื่องตั้งแต่การเปิดตัว libc ++ ครั้งแรก อะไรคือแรงจูงใจสำหรับการไม่ปฏิบัติตามนี้?

2
ฉันควรใช้ libc ++ หรือ libstdc ++? [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ ฉันกำลังพัฒนาไฟล์ปฏิบัติการอินเตอร์เฟสบรรทัดคำสั่งสำหรับทั้ง osx และ linux โดยใช้ c / c ++ โครงการจะเชื่อมโยงกับ opencv ฉันควรใช้ libc ++ หรือ libstdc ++?

2
std :: chrono :: ปีการจัดเก็บอย่างน้อย 17 บิตจริงหรือ
จากcppreference std::chrono::years (since C++20) duration&lt;/*signed integer type of at least 17 bits*/, std::ratio&lt;31556952&gt;&gt; ใช้libc++ดูเหมือนว่าการจัดเก็บการขีดเส้นใต้std::chrono::yearsมีที่shortซึ่งมีการลงนาม16 บิต std::chrono::years( 30797 ) // yields 32767/01/01 std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB มีการพิมพ์ผิดในcppreferenceหรืออะไรอย่างอื่น? ตัวอย่าง: #include &lt;fmt/format.h&gt; #include &lt;chrono&gt; template &lt;&gt; struct fmt::formatter&lt;std::chrono::year_month_day&gt; { char presentation = 'F'; constexpr auto parse(format_parse_context&amp; ctx) …
14 c++  chrono  c++20  libc++ 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.