2011-11-02 33 views
2

你好,祝你有美好的一天。std ::地圖屬性 - C +標準要求?

這是真的(是由標準的要求),該標準C++ std::map<Key, Value>類必須具有以下特性:

  • 它可以工作,如果價值沒有operator=operator=是私有的(和std::map是不是的私人朋友值)。
  • 它可以工作,如果價值沒有默認構造函數或默認構造函數是私有的(和std::map不是一個私人朋友的價值

爲什麼我在問 - 我一直在問到爲內部使用std :: map的類編寫一個嵌入式替換。在IN過程中,事實證明該班級應該在沒有operator=的情況下工作(只要您避免map[key] = value;)。我nuked operator=要求,但事實證明,使用默認的構造函數也造成了一些問題(o_O),因爲類應該是沒有默認的構造函數。那麼......是那些std::map的標準屬性,還是原始類依賴於實現特定/未定義的行爲?我檢查了「C++標準 - ANSI ISO 14882 2003」,我找不到任何這樣的要求。我可能也可以覈實「默認構造函數的要求」(只要用戶避免某些調用,例如調用map[key]爲不存在的鍵),但我當然沒有聽說過std :: map的這些屬性...

所以...你覺得怎麼樣?

回答

2

從我讀的標準(23.2.4 [associative.reqmts]在C++ 11,只是當時已持有C++ 03),VDefaultConstructibleVCopyAssignable是不是強制性的要求實例化容器本身,但只能使用它的一些操作。

但是在C++ 03中,對於所有標準容器,V必須是CopyConstructible。無條件。在C++ 11中,這個要求被取消了,因爲可以使用新的emplace*方法直接構建一個對象。

+0

標準(C++ 03)指定哪些操作需要'V'爲'DefaultConstructible'? – SigTerm

+0

'map [key]'需要默認的構造函數,因爲如果'key'不存在,將會在地圖中插入一個默認構造的實例。 - 這個代碼路徑需要存在,即使從未在運行時獲取。 – visitor

+0

@SigTerm:是的,實際上每個操作都會詳細說明各種需要遵守的要求(在一般要求之上)。大多數情況下,他們可以用一些邏輯來推斷:) –