2012-01-20 349 views
6

當我第一次訪問std::unordered_map using operator []中的元素時,它會自動創建。什麼(如果有的話)保證其初始化? (它保證是價值初始化,或僅被構造)?std :: unordered_map初始化

實施例:

std::unordered_map<void *, size_t> size; 
char *test = new char[10]; 
size[test] += 10; 

是大小[測試]保證是10在該序列的末尾?

回答

16

在這個序列的結尾保證大小[測試]是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;

+0

我已閱讀文檔的那部分內容,但我不確定其含義。 「default-constructed」對於size_t等整數類型意味着什麼? (你能引用一個標準,最好?) – Suma

+0

@Suma:整型不是類型,所以它們沒有構造函數。對這些類型進行初始化值等於零初始化。 (第8章) –

+0

@KerrekSB你確定你不會把C++與Java混淆嗎? Builtins不會默認構建爲零。 – spraff

0

有什麼區別?類類型對象的值初始化需要默認構造,所以答案是「兩者」。對於地圖<K, V>,新對象將使用V()進行初始化。

所有標準容器都使用值初始化或直接初始化(後者可能通過複製構造)來初始化新元素。新的標準容器元素不可能處於「未初始化」狀態(即,不存在初始化元素的默認)的機制。

+0

我認爲「構造」的意義就像當我在一個類中使用int成員變量時,默認的類構造函數不會初始化該值。我想你是對的,但價值初始化由「默認構造」的短語保證?如果V將是POD會怎麼樣?它會被默認構建(即未初始化)還是初始化值? – Suma

+0

@Suma:'V'是值初始化的,所以如果'V'是基本的,它是零初始化的,如果它是類型的,它是默認構造的。對於複合類型,遞歸地應用規則。 –

相關問題