ไม่นานที่ผ่านมาต้องการ - นิพจน์ (วลีที่แนะนำโดยที่สองที่ต้องการ) ไม่ได้รับอนุญาตในการ จำกัด - นิพจน์ (วลีที่นำเสนอโดยต้องการครั้งแรก) มันสามารถปรากฏในคำจำกัดความของแนวคิดเท่านั้น อันที่จริงนี่เป็นสิ่งที่เสนอในส่วนของกระดาษที่มีการอ้างสิทธิ์
อย่างไรก็ตามในปี 2559 มีข้อเสนอที่จะผ่อนคลายข้อ จำกัด [หมายเหตุบรรณาธิการ: P0266 ] สังเกตการหยุดงานของวรรค 4 ในส่วนที่ 4 ของบทความ และดังนั้นจึงต้องเกิด
เพื่อบอกความจริงฉันไม่เคยใช้ข้อ จำกัด นั้นใน GCC ดังนั้นจึงเป็นไปได้เสมอ ฉันคิดว่าวอลเตอร์อาจค้นพบสิ่งนั้นและพบว่ามีประโยชน์นำไปสู่บทความนั้น
เกรงว่าใคร ๆ คิดว่าฉันไม่ไวต่อการเขียนต้องใช้สองครั้งฉันใช้เวลาพยายามหาว่ามันง่ายหรือไม่ คำตอบสั้น ๆ : ไม่
ปัญหาคือมีโครงสร้างทางไวยากรณ์สองรายการที่จำเป็นต้องนำเสนอหลังจากรายการพารามิเตอร์เทมเพลต: โดยทั่วไปแล้วจะมีการแสดงออกของข้อ จำกัด (เช่นP && Q
) และความต้องการทางไวยากรณ์เป็นครั้งคราว (เช่นrequires (T a) { ... }
) นั่นเรียกว่าต้องการการแสดงออก
ก่อนอื่นต้องมีการแนะนำข้อ จำกัด ข้อที่สองต้องการแนะนำการใช้งาน นั่นเป็นเพียงวิธีการเรียบเรียงไวยากรณ์ ฉันไม่คิดว่ามันจะสับสน
ในบางครั้งฉันพยายามที่จะยุบสิ่งเหล่านี้ไปยังสิ่งที่ต้องการ โชคไม่ดีที่นำไปสู่ปัญหาการแยกวิเคราะห์ที่ยากมาก คุณไม่สามารถบอกได้อย่างง่ายดายตัวอย่างเช่นถ้า(
หลังจาก after ต้องการแสดงถึง subexpression ที่ซ้อนกันหรือรายการพารามิเตอร์ ฉันไม่เชื่อว่ามีการบิดเบือนที่สมบูรณ์แบบของไวยากรณ์เหล่านั้น (ดูเหตุผลสำหรับไวยากรณ์การเริ่มต้นที่สม่ำเสมอปัญหานี้มีอยู่ด้วย)
ดังนั้นคุณต้องเลือก: make ต้องการแนะนำนิพจน์ (เหมือนตอนนี้) หรือทำให้มันแนะนำรายการข้อกำหนดแบบพารามิเตอร์
ฉันเลือกวิธีการปัจจุบันเพราะส่วนใหญ่เวลา (ในเกือบ 100% ของเวลา) ฉันต้องการสิ่งอื่นนอกเหนือจากต้องการนิพจน์ และในกรณีที่หายากเหลือเกินฉันต้องการความต้องการนิพจน์สำหรับข้อ จำกัด เฉพาะกิจฉันไม่รังเกียจที่จะเขียนคำสองครั้ง เป็นตัวบ่งชี้ที่ชัดเจนว่าฉันไม่ได้พัฒนาสิ่งที่เป็นนามธรรมสำหรับเทมเพลต (เพราะถ้าฉันมีก็จะมีชื่อ)
ฉันสามารถเลือกที่จะทำให้สิ่งที่ต้องการนำมาซึ่งความต้องการ - แสดงออก ที่จริงแล้วแย่กว่านั้นเพราะข้อ จำกัด ของคุณทั้งหมดจะเริ่มเป็นเช่นนี้:
template<typename T>
requires { requires Eq<T>; }
void f(T a, T b);
ที่นี่ต้องการที่ 2 เรียกว่าข้อกำหนดซ้อน มันประเมินการแสดงออก (รหัสอื่น ๆ ในบล็อกของ require-expression ไม่ได้รับการประเมิน) ฉันคิดว่านี่เป็นวิธีที่เลวร้ายยิ่งกว่าสภาพที่เป็นอยู่ ตอนนี้คุณจะต้องเขียนสองครั้งทุกที่
ฉันสามารถใช้คำหลักเพิ่มเติมได้ นี่เป็นปัญหาในสิทธิของตนเอง --- และไม่ใช่แค่การปลดจักรยาน อาจมีวิธีในการ "แจกจ่ายซ้ำ" คำหลักเพื่อหลีกเลี่ยงการทำซ้ำ แต่ฉันไม่ได้คิดอย่างจริงจัง แต่นั่นไม่ได้เปลี่ยนแก่นแท้ของปัญหา
noexcept(noexcept(...))
อย่างจริงจังมากขึ้นผมมีลางสังหรณ์ว่ามันเป็นเหตุผลที่อยู่เบื้องหลังเดียวกัน