คำถามติดแท็ก language-lawyer

สำหรับคำถามเกี่ยวกับความซับซ้อนของข้อกำหนดอย่างเป็นทางการหรือมีสิทธิ์ของภาษาโปรแกรมและสภาพแวดล้อม

4
ใช้กับ std :: transform กับ std :: back_inserter ได้ไหม
Cppreference มีโค้ดตัวอย่างนี้สำหรับstd::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); แต่มันก็พูดว่า: std::transformไม่ได้รับประกันการประยุกต์ใช้ในการสั่งซื้อของหรือunary_op เมื่อต้องการใช้ฟังก์ชั่นลำดับในการสั่งซื้อหรือจะใช้ฟังก์ชั่นที่ปรับเปลี่ยนองค์ประกอบของลำดับการใช้งานbinary_opstd::for_each นี่น่าจะอนุญาตให้มีการใช้งานแบบขนาน อย่างไรก็ตามพารามิเตอร์ที่สามของstd::transformคือLegacyOutputIteratorซึ่งมี postcondition ต่อไปนี้สำหรับ++r: หลังจากการดำเนินการrนี้ไม่จำเป็นต้องเพิ่มและสำเนาใด ๆ ของค่าก่อนหน้าของrไม่จำเป็นต้องถูกยกเลิกหรือเพิ่มเติม สำหรับฉันแล้วดูเหมือนว่าการกำหนดผลลัพธ์จะต้องเกิดขึ้นตามลำดับ พวกเขาหมายถึงว่าแอปพลิเคชันunary_opอาจไม่เป็นระเบียบและจัดเก็บในตำแหน่งชั่วคราว แต่คัดลอกไปยังเอาต์พุตตามลำดับหรือไม่ ไม่ได้ดูเหมือนสิ่งที่คุณอยากจะทำ ไลบรารี C ++ ส่วนใหญ่ยังไม่ได้ใช้ตัวจัดการแบบขนานจริง ๆ แต่ Microsoft มี ผมค่อนข้างมั่นใจว่านี้เป็นรหัสที่เกี่ยวข้องและผมคิดว่ามันสายนี้populate()ฟังก์ชั่นการบันทึกเพื่อ iterators ชิ้นของการส่งออกซึ่งก็ไม่ได้เป็นสิ่งที่ถูกต้องที่จะทำเพราะ LegacyOutputIteratorสามารถจะถูกยกเลิกโดยการเพิ่มสำเนาของมัน ฉันกำลังคิดถึงอะไร

3
ค่าของตัวชี้ `นี่ 'คงที่ในช่วงชีวิตของวัตถุหรือไม่?
ค่าของthisตัวชี้รับประกันเป็นค่าคงที่ในช่วงชีวิตของวัตถุเฉพาะหรือไม่? ฉันไม่สามารถจินตนาการถึงกรณีที่มันจะเปลี่ยน แต่ไม่ทราบว่าฉันไม่ได้หายไปบางสิ่งบางอย่าง

2
ลูกศร (->) ลำดับความสำคัญของผู้ประกอบการ / ลำดับความสำคัญต่ำสุดหรือลำดับความสำคัญของการมอบหมาย / การมอบหมายรวมมีค่าต่ำสุด?
JLS : ประกอบการต่ำสุดสำคัญคือลูกศรของนิพจน์แลมบ์ดา (->) , ตามโดยผู้ประกอบการที่ได้รับมอบหมาย ตามไปในทิศทางใด (เพิ่มความสำคัญลดลำดับความสำคัญ) - "ติดตาม" หมายถึงการมอบหมายมีลำดับความสำคัญสูงกว่าหรือมีลำดับความสำคัญต่ำกว่า (เกี่ยวข้องกับตัวดำเนินการลูกศร) ฉันเดาว่าเพิ่มมากขึ้นเพราะ "ต่ำสุด" (สำหรับลูกศร) หมายถึงต่ำที่สุดอย่างแน่นอน ดังที่ฉันเข้าใจแล้วลูกศร (->) ควรอยู่ที่ด้านล่างสุดของตารางตัวดำเนินการของพรินซ์ตัน (ซึ่งอยู่ต่ำกว่าตัวดำเนินการที่ได้รับมอบหมายทั้งหมด) ดังนั้นลูกศร (->) มีระดับความสำคัญ 0 (ศูนย์) (ตามตารางนั้น) ฉันถูกต้องในการทำความเข้าใจของฉัน? ExamTrayดูเหมือนจะบอกว่าลูกศรลำดับความสำคัญเป็นอย่างน้อยเช่นเดียวกับการมอบหมาย ... และชี้แจงว่าลูกศรสัมพันธ์เป็นซ้าย -> ถึง -> ขวา (ซึ่งแตกต่างจากการกำหนด) ฉันไม่พบใบเสนอราคาของ JLS สำหรับการเชื่อมโยงลูกศร ฉันมักจะคิดว่าลำดับความสำคัญของการมอบหมายนั้นต่ำที่สุดโดยมีเหตุผล

2
การกระโดดข้ามการกำหนดค่าเริ่มต้นของตัวแปรไม่ถูกต้องหรือทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดหรือไม่?
พิจารณารหัสนี้: void foo() { goto bar; int x = 0; bar: ; } GCC และ Clang ปฏิเสธเนื่องจากการข้ามไปยังการbar:ข้ามการกำหนดค่าเริ่มต้นของตัวแปร MSVC ไม่บ่นเลย (ยกเว้นการใช้xหลังจากbar:ทำให้เกิดการเตือน) เราสามารถทำสิ่งเดียวกันด้วยswitch: void foo() { switch (0) { int x = 0; case 0: ; } } ตอนนี้ทั้งสามคอมไพเลอร์ปล่อยข้อผิดพลาด ตัวอย่างเหล่านั้นไม่ดีหรือไม่ หรือพวกเขาทำให้ UB? ฉันเคยคิดว่าทั้งสองรูปแบบไม่ดี แต่ฉันไม่สามารถหาส่วนที่น่ารำคาญของมาตรฐาน [stmt.goto]ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้และไม่ไม่[stmt.select]

1
เหตุใดไฟล์จัดการมาตรฐาน C ++ จึงหาวิธีการใช้งาน
C ++ ใช้streamoffชนิดเพื่อแสดงออฟเซ็ตภายในสตรีม (ไฟล์) และกำหนดไว้ดังนี้ใน [stream.types]: using streamoff = implementation-defined ; ประเภท streamoff เป็นคำพ้องความหมายสำหรับหนึ่งในประเภทอินทิกรัลพื้นฐานที่ลงนามแล้วซึ่งมีขนาดเพียงพอที่จะแสดงขนาดไฟล์สูงสุดที่เป็นไปได้สำหรับระบบปฏิบัติการ 287) 287) ความยาวโดยทั่วไป สิ่งนี้สมเหตุสมผลเนื่องจากอนุญาตให้ค้นหาไฟล์ขนาดใหญ่ (ต่างจากการใช้longซึ่งอาจมีความกว้างเพียง 32 บิต) [filebuf.virtuals] กำหนดbasic_filebufฟังก์ชั่นของการค้นหาภายในไฟล์ดังนี้: pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_typeเทียบเท่ากับstreamoffดู [iostreams.limits.pos] อย่างไรก็ตามมาตรฐานก็จะอธิบายผลกระทบของฟังก์ชั่น ฉันรู้สึกหงุดหงิดกับประโยคสุดท้ายที่ต้องเรียกร้องให้fseek: ผลกระทบ : อนุญาตwidthแสดงa_codecvt.encoding()ว่า หากis_open() == falseหรือoff != 0 && width <= …

1
เสียงดังกราวถูกต้องหรือไม่ในการปฏิเสธรหัสที่คลาสที่ซ้อนกันของแม่แบบคลาสนั้นถูกกำหนดผ่านความเชี่ยวชาญเฉพาะทางหรือไม่
รับแม่แบบชั้นเรียนต่อไปนี้: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; เรากำหนดInnerแยกต่างหากสำหรับแต่ละความเชี่ยวชาญของOuter: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; จากนั้นกำหนดฟังก์ชันสมาชิกfหนึ่งครั้งสำหรับความเชี่ยวชาญพิเศษทั้งหมดของOuter: auto Outer<T>::f(Inner) -> void { } แต่เสียงดังกราว (9.0.0) บ่น: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ เราสามารถหลบเลี่ยงข้อผิดพลาดของคอมไพเลอร์โดยให้คำจำกัดความของInnerความเชี่ยวชาญอื่น ๆ ของOuter: template<typename T> struct Outer<T>::Inner …

1
sizeof (enum) สามารถแตกต่างจาก sizeof (std :: รากฐาน_type <Enum> :: type) ได้หรือไม่
เมื่อเร็ว ๆ นี้เกิดขึ้นในการตรวจสอบรหัสที่ในตัวอย่างต่อไปนี้: enum class A : uint8_t { VAL1, VAL2 }; ... std::vector&lt;A&gt; vOfA; // Assume this is sized and full of some stuff. std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A)); เราควรจะใช้แทนsizeof(std::underlying_type&lt;A&gt;::type) เป็นไปได้ไหมว่าสิ่งเหล่านี้จะแตกต่างกันไป? มีใครบางคนอ้างมาตรฐานที่รับประกันสิ่งนี้หรือไม่?sizeof(A)

1
ตัวแยกวิเคราะห์ Haskell ควรอนุญาตให้เลข Unicode เป็นตัวอักษรตัวเลขหรือไม่
ในการออกกำลังกายฉันกำลังเขียนโปรแกรมแยกวิเคราะห์สำหรับ Haskell ตั้งแต่เริ่มต้น ในการสร้าง lexer ฉันสังเกตเห็นกฎต่อไปนี้ในรายงาน Haskell 2010 : หลัก → ascDigit | uniDigit ascDigit → 0| 1| … | 9 uniDigit →ใด ๆ Unicode ทศนิยมหลัก octit → 0| 1| … | 7 hexit → หลัก | A| … | F| a| … |f ทศนิยม → หลัก { หลัก } …

1
คอมไพเลอร์ c ++ จะหาตัวแปรภายนอกได้อย่างไร
ฉันรวบรวมโปรแกรมนี้โดย g ++ และ clang ++ มีความแตกต่าง: g ++ พิมพ์ 1 แต่พิมพ์ clang ++ 2 ดูเหมือนว่า g ++: var var ที่กำหนดไว้ในขอบเขตที่สั้นที่สุด clang ++: ตัวแปร extern ถูกกำหนดในขอบเขตโกลบอลที่สั้นที่สุด ข้อมูลจำเพาะ C ++ มีข้อกำหนดใด ๆ main.cpp #include &lt;iostream&gt; static int i; static int *p = &amp;i; int main() { int i; { extern int …

2
ทำไม `std :: basic_ios` มีตัวสร้างสาธารณะ
std::basic_iosมีตัวสร้างสาธารณะ : explicit basic_ios (std::basic_streambuf&lt;CharT,Traits&gt;* sb); IMO เหตุผลเดียวที่คลาสมีตัวสร้างสาธารณะคือการใช้อินสแตนซ์แบบสแตนด์อโลนของคลาสนั้นในโปรแกรม ถ้าชั้นที่มีอยู่เท่านั้นที่จะมีชั้นเรียนอื่น ๆ สืบเชื้อสายมาจากมัน (ขณะที่ดูเหมือนว่าจะเป็นกรณีสำหรับbasic_ios) protectedทั้งหมดก่อสร้างระดับที่ควรจะเป็น สิ่งก่อสร้างของstd::ios_baseทั้งหมดได้รับการคุ้มครอง แต่ด้วยเหตุผลบางอย่างผู้ออกแบบมาตรฐานทำให้ผู้สร้างbasic_iosสาธารณะคนนี้ basic_iosจะถูกใช้เป็นชั้นฐานประเภทกระแสหลาย ๆ และฉันไม่สามารถมองเห็นกรณีการใช้งานที่คุณต้องการมีหนึ่งที่ไม่ได้เป็นอย่างน้อยหรือbasic_istream basic_ostreamมีไหม

2
เป็นโปรแกรมที่ไม่เคยยกเลิกโปรแกรม C ++ ที่ถูกต้องหรือไม่?
จำเป็นต้องมีโปรแกรมหรือไม่ ในคำอื่น ๆ เป็นโปรแกรมที่ทำงานตลอดเวลาพฤติกรรมที่ไม่ได้กำหนดทางเทคนิค? โปรดทราบว่านี่ไม่เกี่ยวกับลูปที่ว่างเปล่า การพูดเกี่ยวกับโปรแกรมที่ทำ "สิ่ง" (เช่นพฤติกรรมที่สังเกตได้) ตลอดไป เช่นบางสิ่งเช่นนี้ int main() { while (true) { try { get_input(); // calls IO process(); put_output(); // calls IO, has observable behavior // never break, exit, terminate, etc } catch(...) { // ignore all exceptions // don't (re)throw // never go out …

1
ทำไมการปรับฐานว่างเปล่าจึงถูกห้ามเมื่อคลาสฐานที่ว่างเปล่าเป็นตัวแปรสมาชิกด้วย?
การเพิ่มประสิทธิภาพฐานที่ว่างเปล่าดีมาก อย่างไรก็ตามมันมาพร้อมกับข้อ จำกัด ดังต่อไปนี้: การเพิ่มประสิทธิภาพฐานว่างเปล่าเป็นสิ่งต้องห้ามหากหนึ่งในคลาสฐานที่ว่างเปล่าเป็นชนิดหรือฐานของประเภทของข้อมูลสมาชิกไม่คงที่ครั้งแรกเนื่องจาก subobjects ฐานสองประเภทเดียวกันจะต้องมีที่อยู่ที่แตกต่างกันภายในการแสดงวัตถุ ประเภทที่ได้รับมากที่สุด เพื่ออธิบายข้อ จำกัด นี้ให้พิจารณารหัสต่อไปนี้ static_assertจะล้มเหลว ในขณะที่การเปลี่ยนแปลงอย่างใดอย่างหนึ่งFooหรือBarเพื่อสืบทอดจากBase2จะเป็นการหลีกเลี่ยงข้อผิดพลาด: #include &lt;cstddef&gt; struct Base {}; struct Base2 {}; struct Foo : Base {}; struct Bar : Base { Foo foo; }; static_assert(offsetof(Bar,foo)==0,"Error!"); ฉันเข้าใจพฤติกรรมนี้อย่างสมบูรณ์ สิ่งที่ฉันไม่เข้าใจคือสาเหตุพฤติกรรมนี้โดยเฉพาะอย่างยิ่งที่มีอยู่ เห็นได้ชัดว่ามีการเพิ่มเข้ามาด้วยเหตุผลเนื่องจากเป็นการเพิ่มที่ชัดเจนไม่ใช่การกำกับดูแล เหตุผลนี้คืออะไร โดยเฉพาะอย่างยิ่งทำไม subobjects ทั้งสองควรจะต้องมีที่อยู่ที่แตกต่างกัน? ในข้างต้นBarเป็นประเภทและfooเป็นตัวแปรสมาชิกประเภทนั้น ฉันไม่เห็นว่าทำไมชั้นฐานของBarเรื่องถึงชั้นฐานของประเภทfooหรือในทางกลับกัน อันที่จริงฉันมีอะไรถ้าฉันคาดหวังว่า&amp;fooจะเป็นเช่นเดียวกับที่อยู่ของBarอินสแตนซ์ที่มีมัน - มันจะต้องอยู่ในสถานการณ์อื่น(1) (1)หลังจากทั้งหมดฉันไม่ได้ทำอะไรแฟนซีกับการvirtualสืบทอดคลาสพื้นฐานว่างเปล่าโดยไม่คำนึงถึงและการคอมไพล์ด้วยBase2แสดงว่าไม่มีอะไรแตกในกรณีนี้โดยเฉพาะ แต่ชัดเจนว่าเหตุผลนี้ไม่ถูกต้องอย่างใดอย่างหนึ่งและมีสถานการณ์อื่น ๆ …

1
ความแตกต่างของอินสแตนซ์ constexpr สองตัวของตัวชี้ __func__ ยังคงเป็น constexpr หรือไม่
นี่คือ C ++ ที่ถูกต้องหรือไม่ int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC และ MSVC คิดว่ามันตกลงดังกราวคิดว่ามันไม่ได้: คอมไพเลอร์ Explorer ที่ คอมไพเลอร์ทุกคนยอมรับว่าอันนี้ตกลง: คอมไพเลอร์ Explorer ที่ int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; …

1
นี่เป็นข้อบกพร่องใน std :: gcd หรือไม่
ฉันเจอพฤติกรรมนี้std::gcdซึ่งฉันพบว่าไม่คาดคิด: #include &lt;iostream&gt; #include &lt;numeric&gt; int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type&lt;decltype(a), decltype(b)&gt;::type; C ca = std::abs(a); C cb = b; std::cout &lt;&lt; a &lt;&lt; ' ' &lt;&lt; ca &lt;&lt; '\n'; std::cout &lt;&lt; …

2
เหตุใดเราไม่สามารถสร้างวัตถุที่สร้างขึ้นได้เล็กน้อยโดยใช้ malloc หากตัวสร้างปริยายของ trivial ไม่ทำงาน?
ฉันมีปัญหาในการทำความเข้าใจย่อหน้าต่อไปนี้ที่อ้างอิงจากcppreferenceเกี่ยวกับConstructorปริยาย ฉันค้นหา stackoverflow แล้วแต่ยังไม่ได้รับคำตอบที่ชัดเจน ได้โปรดช่วยด้วย คอนสตรัคค่าเริ่มต้นเล็กน้อยเป็นตัวสร้างที่ไม่มีการดำเนินการ ชนิดข้อมูลทั้งหมดที่เข้ากันได้กับภาษา C (ชนิด POD) สามารถเริ่มต้นสร้างได้เล็กน้อย ซึ่งแตกต่างจากใน C อย่างไรก็ตามวัตถุที่มีตัวสร้างเริ่มต้นเล็กน้อยไม่สามารถสร้างได้โดยการแปลหน่วยความจำที่สอดคล้องกันอย่างเหมาะสมเช่นหน่วยความจำที่จัดสรรด้วย std :: malloc: การจัดวางตำแหน่งใหม่จำเป็นต้องแนะนำวัตถุใหม่อย่างเป็นทางการ โดยเฉพาะอย่างยิ่งถ้านวกรรมิกเริ่มต้นเล็กน้อยไม่ทำอะไรเลยทำไมเราไม่สามารถตีความการจัดเก็บและตีความว่ามีวัตถุที่มีประเภทที่กำหนด คุณช่วยยกตัวอย่างสำหรับพฤติกรรมที่ไม่ได้กำหนดซึ่งอาจเป็นสาเหตุได้หรือไม่?

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