當我第一次訪問std::unordered_map using operator []中的元素時,它會自動創建。什麼(如果有的話)保證其初始化? (它保證是價值初始化,或僅被構造)?std :: unordered_map初始化
實施例:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
是大小[測試]保證是10在該序列的末尾?
當我第一次訪問std::unordered_map using operator []中的元素時,它會自動創建。什麼(如果有的話)保證其初始化? (它保證是價值初始化,或僅被構造)?std :: unordered_map初始化
實施例:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
是大小[測試]保證是10在該序列的末尾?
在這個序列的結尾保證大小[測試]是10?
是的。 在您的代碼的最後一行,size[test]
的元素值初始化爲T()
,或在這種情況下size_t()
:
C++ 11 23.4.4.3地圖元素訪問[map.access]
T& operator[](const key_type& x)
;1影響:如果在地圖中沒有與x等價的鍵,則將value_type(x,T())插入到地圖中。
至於T()
,確切的語言是一種較爲複雜,所以我會盡力引述相關位:是
C++ 11 16年5月8日初始化的語義如下。
- 如果初始值設定項是(),則對該對象進行值初始化。
8.5.7要值初始化類型T的對象是指:
- 如果T是一個(可能是CV-合格)類類型...
- 如果T是(可能是cv合格的)非工會類類型...
- 如果T是一個數組類型,那麼每個元素是值初始化;
- 否則,該對象被零初始化。
8.5.5要零初始化對象或類型T的參考是指:
- 如果T是一個標量類型(3。9),該對象被設置爲值0(零),作爲積分常數表達式,轉換爲T;
有什麼區別?類類型對象的值初始化需要默認構造,所以答案是「兩者」。對於地圖<K, V>
,新對象將使用V()
進行初始化。
所有標準容器都使用值初始化或直接初始化(後者可能通過複製構造)來初始化新元素。新的標準容器元素不可能處於「未初始化」狀態(即,不存在初始化元素的默認)的機制。
我認爲「構造」的意義就像當我在一個類中使用int成員變量時,默認的類構造函數不會初始化該值。我想你是對的,但價值初始化由「默認構造」的短語保證?如果V將是POD會怎麼樣?它會被默認構建(即未初始化)還是初始化值? – Suma
@Suma:'V'是值初始化的,所以如果'V'是基本的,它是零初始化的,如果它是類型的,它是默認構造的。對於複合類型,遞歸地應用規則。 –
我已閱讀文檔的那部分內容,但我不確定其含義。 「default-constructed」對於size_t等整數類型意味着什麼? (你能引用一個標準,最好?) – Suma
@Suma:整型不是類型,所以它們沒有構造函數。對這些類型進行初始化值等於零初始化。 (第8章) –
@KerrekSB你確定你不會把C++與Java混淆嗎? Builtins不會默認構建爲零。 – spraff