ขึ้นอยู่กับสิ่งที่เกินพิกัดที่เรากำลังพูดถึง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
ธรรมชาติเริ่มต้นที่int
0 [dcl.init] / 6
ใช่รหัสของคุณรับประกันว่าจะส่งคืน 0 ...