ขึ้นอยู่กับสิ่งที่เกินพิกัดที่เรากำลังพูดถึงstd::unordered_map::operator[]เทียบเท่ากับ[unord.map.elem]
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(การโอเวอร์โหลดที่มีการอ้างอิงค่า rvalue เพียงแค่ย้ายkเข้าไปtry_emplaceและเหมือนกัน)
หากเป็นองค์ประกอบที่มีอยู่ภายใต้คีย์kในแผนที่แล้วtry_emplaceส่งกลับ iterator falseองค์ประกอบที่และ มิฉะนั้นtry_emplaceแทรกองค์ประกอบใหม่ภายใต้คีย์kและส่งกลับ iterator ไปที่และtrue [unord.map.modifiers] :
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
สิ่งที่น่าสนใจสำหรับเราคือกรณีที่ไม่มีองค์ประกอบ[unord.map.modifiers] / 6 :
มิฉะนั้นแทรกวัตถุประเภทvalue_typeสร้างด้วยpiecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(การโอเวอร์โหลดที่ใช้การอ้างอิงค่า rvalue เพิ่งจะย้ายkไปforward_as_tupleและอีกครั้งก็เหมือนกัน)
เนื่องจากvalue_typeเป็นpair<const Key, T> [unord.map.overview] / 2สิ่งนี้บอกเราว่าองค์ประกอบแผนที่ใหม่จะถูกสร้างขึ้นเป็น:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
เนื่องจากargsว่างเปล่าเมื่อมาจากoperator[]สิ่งนี้จะทำให้ค่าใหม่ของเราถูกสร้างขึ้นในฐานะสมาชิกของpairไม่มีข้อโต้แย้ง[pairs.pair] / 14ซึ่งเป็นการเริ่มต้นโดยตรง[class.base.init] / 7ของประเภทค่าที่Tใช้()เป็นค่าเริ่มต้นที่เดือดลงไปเริ่มต้นค่า[dcl.init] /17.4 เริ่มต้นค่าของintเป็นศูนย์เริ่มต้น[dcl.init] / 8 และศูนย์การเริ่มต้นของintธรรมชาติเริ่มต้นที่int0 [dcl.init] / 6
ใช่รหัสของคุณรับประกันว่าจะส่งคืน 0 ...