ในขณะC++11
นี้มีการเพิ่มกรณีพิเศษในชุดฟังก์ชันพลังงาน (และอื่น ๆ ) C++11 [c.math] /11
รัฐหลังจากแสดงรายการfloat/double/long double
โอเวอร์โหลดทั้งหมด(เน้นและถอดความ):
นอกจากนี้จะมี overloads เพิ่มเติมเพียงพอที่จะให้แน่ใจว่าถ้าโต้แย้งใด ๆ ที่สอดคล้องกับdouble
พารามิเตอร์ที่มีประเภทdouble
หรือชนิดจำนวนเต็มแล้วขัดแย้งทั้งหมดสอดคล้องกับพารามิเตอร์ถูกโยนอย่างมีประสิทธิภาพเพื่อdouble
double
ดังนั้นโดยพื้นฐานแล้วพารามิเตอร์จำนวนเต็มจะได้รับการอัปเกรดเป็นสองเท่าเพื่อดำเนินการ
ก่อนหน้าC++11
(ซึ่งเป็นช่วงที่คุณถามคำถาม) ไม่มีการโอเวอร์โหลดจำนวนเต็ม
ตั้งแต่ผมได้รับค่าเชื่อมโยงอย่างใกล้ชิดกับผู้สร้างของC
มิได้C++
ในวันของการสร้างของพวกเขา ( แต่ผมรู้สึกค่อนข้างเก่า) หรือเป็นส่วนหนึ่งของคณะกรรมการมาตรฐาน ANSI / ISO ที่สร้างมาตรฐานนี้เป็นจำเป็นต้องมีความคิดเห็นในส่วนของฉัน ฉันอยากจะคิดว่ามันเป็นความคิดเห็นที่มีข้อมูลแต่อย่างที่ภรรยาของฉันจะบอกคุณ (บ่อยครั้งและไม่จำเป็นต้องให้กำลังใจมากนัก) ฉันเคยคิดผิดมาก่อน :-)
ข้อสันนิษฐานสำหรับสิ่งที่คุ้มค่ามีดังนี้
ฉันสงสัยว่าสาเหตุที่ pre-ANSI ดั้งเดิมC
ไม่มีคุณสมบัตินี้เป็นเพราะมันไม่จำเป็นโดยสิ้นเชิง ประการแรกมีวิธีที่ดีอย่างสมบูรณ์ในการสร้างเลขยกกำลังจำนวนเต็ม (ด้วยการเพิ่มเป็นสองเท่าจากนั้นเพียงแค่แปลงกลับเป็นจำนวนเต็มตรวจสอบจำนวนเต็มล้นและน้อยเกินไปก่อนที่จะแปลง)
ประการที่สองสิ่งที่คุณต้องจำไว้อีกประการหนึ่งคือเจตนาดั้งเดิมของC
การเป็นภาษาโปรแกรมระบบและเป็นที่น่าสงสัยว่าจุดลอยตัวนั้นเป็นที่ต้องการหรือไม่ในเวทีนั้นหรือไม่
เนื่องจากหนึ่งในกรณีการใช้งานเริ่มต้นคือการเขียนโค้ด UNIX จุดลอยตัวจึงไร้ประโยชน์ BCPL ซึ่งเป็นฐานของ C ก็ไม่ได้ใช้พลังเช่นกัน (ไม่มีจุดลอยตัวเลยจากหน่วยความจำ)
นอกเหนือจากนั้นตัวดำเนินการกำลังหนึ่งอาจเป็นตัวดำเนินการไบนารีมากกว่าการเรียกไลบรารี คุณไม่ต้องเพิ่มจำนวนเต็มสองจำนวนx = add (y, z)
แต่มีx = y + z
- ส่วนหนึ่งของภาษาที่เหมาะสมแทนที่จะเป็นไลบรารี
ประการที่สามเนื่องจากการใช้งานอินทิกรัลพาวเวอร์เป็นเรื่องเล็กน้อยจึงเกือบจะแน่นอนว่าผู้พัฒนาภาษาจะใช้เวลาของพวกเขาในการจัดหาสิ่งที่เป็นประโยชน์มากขึ้นได้ดีกว่า (ดูความคิดเห็นด้านล่างเกี่ยวกับค่าเสียโอกาส)
ที่เกี่ยวข้องกับต้นฉบับC++
ด้วย เนื่องจากการดำเนินงานได้อย่างมีประสิทธิภาพเดิมเป็นเพียงผู้แปลซึ่งผลิตรหัสก็ดำเนินการไปหลายของคุณลักษณะของC
C
ความตั้งใจเดิมคือ C-with-Class ไม่ใช่ C-with-Class-plus-a-bit-bit-extra-math-stuff
เหตุใดจึงไม่เคยเพิ่มมาตรฐานนี้มาก่อนC++11
คุณต้องจำไว้ว่าหน่วยงานกำหนดมาตรฐานมีแนวทางเฉพาะที่ต้องปฏิบัติตาม ตัวอย่างเช่น ANSI C
ได้รับมอบหมายให้เขียนโค้ดการปฏิบัติที่มีอยู่โดยเฉพาะไม่ใช่เพื่อสร้างภาษาใหม่ มิฉะนั้นพวกเขาอาจจะบ้าไปแล้วและให้ Ada กับเรา :-)
การทำซ้ำในภายหลังของมาตรฐานนั้นยังมีแนวทางที่เฉพาะเจาะจงและสามารถพบได้ในเอกสารเหตุผล (เหตุผลว่าทำไมคณะกรรมการจึงตัดสินใจบางอย่างไม่ใช่เหตุผลสำหรับภาษานั้น ๆ )
ตัวอย่างเช่นC99
เอกสารเหตุผลโดยเฉพาะC89
นำหลักการชี้นำสองประการมาใช้ซึ่ง จำกัด สิ่งที่สามารถเพิ่มได้:
- ใช้ภาษาให้เล็กและเรียบง่าย
- ให้วิธีเดียวในการดำเนินการ
มีการวางแนวทาง (ไม่จำเป็นต้องเป็นแนวทางเฉพาะเหล่านั้น) สำหรับแต่ละคณะทำงานและด้วยเหตุนี้จึง จำกัดC++
คณะกรรมการ (และกลุ่ม ISO อื่น ๆ ทั้งหมด) ด้วย
นอกจากนี้หน่วยงานกำหนดมาตรฐานยังตระหนักดีว่ามีค่าเสียโอกาส (คำศัพท์ทางเศรษฐกิจหมายถึงสิ่งที่คุณต้องละทิ้งสำหรับการตัดสินใจ) สำหรับการตัดสินใจทุกครั้งที่พวกเขาทำ ตัวอย่างเช่นค่าเสียโอกาสในการซื้อเครื่องเกม uber มูลค่า 10,000 เหรียญนั้นเป็นความสัมพันธ์ที่จริงใจ (หรืออาจเป็นความสัมพันธ์ทั้งหมด ) กับอีกครึ่งหนึ่งของคุณเป็นเวลาประมาณหกเดือน
Eric Gunnerson อธิบายสิ่งนี้ได้ดีพร้อมกับคำอธิบาย -100 คะแนนของเขาว่าทำไมสิ่งต่างๆจึงไม่ถูกเพิ่มลงในผลิตภัณฑ์ของ Microsoft เสมอไปโดยทั่วไปแล้วคุณลักษณะจะเริ่มต้น 100 คะแนนในหลุมดังนั้นจึงต้องเพิ่มมูลค่าเล็กน้อยที่จะได้รับการพิจารณา
กล่าวอีกนัยหนึ่งคุณอยากจะมีตัวดำเนินการด้านพลังงานแบบบูรณาการ (ซึ่งจริงๆแล้ว coder ที่มีครึ่งเดียวสามารถแส้ได้ภายในสิบนาที) หรือเพิ่มมัลติเธรดลงในมาตรฐานหรือไม่? สำหรับตัวฉันเองฉันต้องการที่จะมีอย่างหลังและไม่ต้องยุ่งเกี่ยวกับการใช้งานที่แตกต่างกันภายใต้ UNIX และ Windows
ฉันต้องการดูคอลเลกชันหลายพันหลายพันรายการในห้องสมุดมาตรฐาน (แฮชต้นไม้ต้นไม้สีแดงดำพจนานุกรมแผนที่ตามอำเภอใจและอื่น ๆ ) เช่นกัน แต่ตามเหตุผล:
มาตรฐานคือสนธิสัญญาระหว่างผู้ใช้และโปรแกรมเมอร์
และจำนวนผู้ดำเนินการในหน่วยงานมาตรฐานก็มีมากกว่าจำนวนโปรแกรมเมอร์ (หรืออย่างน้อยโปรแกรมเมอร์ที่ไม่เข้าใจต้นทุนค่าเสียโอกาส) หากมีการเพิ่มสิ่งต่างๆทั้งหมดนั้นมาตรฐานถัดไปC++
จะเป็นC++215x
และอาจถูกนำไปใช้อย่างสมบูรณ์โดยนักพัฒนาคอมไพเลอร์สามร้อยปีหลังจากนั้น
อย่างไรก็ตามนั่นคือความคิด (ค่อนข้างใหญ่โต) ของฉันเกี่ยวกับเรื่องนี้ หากมีเพียงคะแนนโหวตเท่านั้นที่ได้รับจากปริมาณมากกว่าคุณภาพในไม่ช้าฉันจะเป่าคนอื่น ๆ ออกจากน้ำ ขอบคุณสำหรับการฟัง :-)