auto
สามารถช่วยประสิทธิภาพการทำงานโดยการหลีกเลี่ยงการแปลงนัยเงียบ ตัวอย่างที่ฉันคิดว่าน่าสนใจมีดังต่อไปนี้
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
เห็นข้อบกพร่องหรือไม่ ที่นี่เราคิดว่าเราใช้ทุกรายการในแผนที่โดยการอ้างอิง const และใช้ช่วงใหม่สำหรับการแสดงออกเพื่อทำให้เจตนาของเราชัดเจน แต่จริงๆแล้วเรากำลังคัดลอกทุกองค์ประกอบ นี้เป็นเพราะstd::map<Key, Val>::value_type
เป็นไม่ได้std::pair<const Key, Val>
std::pair<Key, Val>
ดังนั้นเมื่อเรา (โดยนัย) มี:
std::pair<Key, Val> const& item = *iter;
แทนที่จะทำการอ้างอิงไปยังวัตถุที่มีอยู่แล้วปล่อยให้เป็นแบบนั้นเราต้องทำการแปลงแบบ คุณได้รับอนุญาตให้ทำการอ้างอิง const ไปยังออบเจ็กต์ (หรือชั่วคราว) ประเภทอื่นตราบใดที่ยังมีการแปลงโดยนัยเช่น:
int const& i = 2.0; // perfectly OK
การแปลงประเภทเป็นการแปลงโดยนัยที่ได้รับอนุญาตด้วยเหตุผลเดียวกับที่คุณสามารถแปลงเป็นconst Key
a Key
แต่เราต้องสร้างชั่วคราวของประเภทใหม่เพื่อให้อนุญาต ดังนั้นลูปของเราจึงมีประสิทธิภาพ:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(แน่นอนว่าไม่มี__tmp
วัตถุจริงๆมันมีไว้เพื่อประกอบภาพเท่านั้นในความเป็นจริงชั่วคราวที่ไม่มีชื่อจะถูกผูกไว้กับitem
ตลอดชีวิตของมัน)
เพิ่งเปลี่ยนเป็น:
for (auto const& item : m) {
// do stuff
}
เพิ่งบันทึกสำเนาของเราเป็นจำนวนมากตอนนี้ประเภทที่อ้างอิงตรงกับประเภทของเครื่องมือเริ่มต้นดังนั้นไม่จำเป็นต้องใช้ชั่วคราวหรือทำการแปลงเราสามารถทำการอ้างอิงโดยตรง