2012-06-15 26 views
18

我們知道,如果我們嘗試使用運算符[]訪問不存在的std::map鍵,該函數將使用該鍵插入一個新元素。map operator []和bool作爲值

我們:std::map<std::string, bool> map_xxx;

能夠保證所有的訪問的map_xxx["nonexistent_key"]不存在的鍵後,第二個參數的值將始終爲false

ps。如果沒有,任何想法如何有這種行爲?

+0

我認爲你的問題真的是:「bool()'?的價值是什麼,從[本頁]上顯示的代碼可以看出(http://en.cppreference.com/w/ CPP /容器/圖/ operator_at)。 – chris

+0

[std :: pair <>的默認構造函數是否將基本類型(int等)設置爲零?](http://stackoverflow.com/questions/9025792/does-the-default-constructor-of -stdpair - 組 - 基本類型-INT-等等到零) – ildjarn

回答

26

是的。要插入的值保證爲false


在C++ 98,該機構被稱爲默認的初始化,指定爲零初始化用於非班;這是布爾人的false。由於C++ 03,該機制被稱爲值初始化,對於非類仍指定爲零初始化;因此布爾值仍然爲false。例如,讓我們來看看C++ 14在這方面的說明。

從§23.4.4.3開始;只是用「T」代替bool

Ť &操作符[](常量爲key_type & X);

  1. 效果:如果沒有鍵等同於圖的x,插入VALUE_TYPE(X,T())到地圖。
  2. 要求:key_type應爲CopyInsertable,mapped_type應爲DefaultInsertable入 * this。

從第8.5節,從底部向上消化段落:

要零初始化對象或類型T的參考是指:

- 如果T是一個標量類型(3.9),對象被初始化爲,將整數立即數(零)轉換爲T;

...

值初始化類型T的對象是指:

- 如果T是一個(可能是CV-合格)類型(第9)或者沒有默認的構造(12。1)或用戶提供或刪除的默認構造函數,則該對象被默認初始化;

- 如果T是一個沒有用戶提供或刪除的默認構造函數的(可能是cv限定的)類類型,那麼該對象將被初始化並檢查默認初始化的語義約束,如果T有非平凡的默認構造函數,對象被默認初始化;

- 如果T是一個數組類型,則每個元素都進行了值初始化;

- 否則,對象是零初始化

...

其初始化爲空集括號的一個目的,即,(),應值初始化

從§4.12:

算術,無作用域枚舉,指針,或指向構件類型的prvalue可以轉換爲bool類型的prvalue。 A 零值,空指針值或空成員指針值轉換爲假;任何其他值都將轉換爲true。對於直接初始化(8.5),std :: nullptr_t類型的prvalue可以轉換爲類型爲bool的prvalue;結果值是錯誤的。

相關問題