2012-07-31 97 views
10

通過this answer啓發,我試圖在下一個例子:初始化映射時爲什麼不能省略大括號?

#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    const std::map< int, std::string > mapping = { 
     1, "ONE", 
     2, "TWO", 
    }; 

    const auto it = mapping.find(1); 
    if (mapping.end() != it) 
    { 
    std::cout << it->second << std::endl; 
    } 
    else 
    { 
    std::cout << "not found!" << std::endl; 
    } 
} 

和編譯與下一個錯誤消息(G ++ 4.6.1)失敗:

gh.cpp:11:5: error: could not convert '{1, "ONE", 2, "TWO"}' from '<brace-enclosed initializer list>' to 'const std::map<int, std::basic_string<char> >' 

我知道如何解決它:

const std::map< int, std::string > mapping = { 
     {1, "ONE"}, 
     {2, "TWO"}, 
    }; 

但爲什麼編譯失敗的例子?

回答

22

由於該映射是非聚合映射,並且包含非聚合元素(std::pair<key_type, mapped_type>),所以它需要一個初始化程序列表,其中每個對都有一個初始化程序列表。

std::pair<int,int> p0{ 1,2 }; // single pair 
std::map<int, int> m { { 1,2 } }; // map with one element 
std::map<int, int> m { { 1,2 }, { 3,4} }; // map with two elements 

請記住,大括號的規則適用於聚合,所以它們不適用於此。

+0

'std :: pair'是一個聚合,因此它不應該需要它自己的初始化列表(就像它在[我鏈接的答案](http://stackoverflow.com/a/ 11735045/476681)。或者,我錯了嗎? – 2012-07-31 14:49:15

+3

@BЈовић實際上,'std :: pair'不是一個聚合。我不知道什麼時候可以忽略{}'的規則,但是在這種情況下它可能是沒有意義的,我稍後可能會說更多... – juanchopanza 2012-07-31 14:58:58

+1

@BЈовић看§8.5,我認爲原因在於大括號只適用於聚合類型 – juanchopanza 2012-07-31 18:35:26

3

從我完成C++開始就已經很長時間了,但我的猜測是因爲std::map期望一組單個對象,每個對象都包含一個鍵和一個值對。

擁有單個項目的單個列表沒有任何意義,而且也很難閱讀(以確保您有多個項目可以被兩個整除)。

8

的C++ 11標準允許括號來僅當目標是聚集被省略:

8.5.1聚集[dcl.init.aggr]

聚集是陣列或沒有用戶提供的 構造函數(12.1),沒有用於非靜態的 數據成員(9.2)的支持或等同初始化程序,沒有私有或受保護的非靜態數據成員 (第11章) ,沒有基類(第10章),也沒有虛函數 (10.3)。

...

(第11段)

在形式

T x = { a }; 

牙套可以在初始化列表被省略如下的聲明。如果 初始化程序列表以左大括號開頭,則後續的 逗號分隔的初始化子句列表將初始化 的子成員;這是錯誤的,因爲有更多的 初始化子句比成員。但是,如果子集合的初始化程序列表 不是以左大括號開頭,則只有 列表中的足夠初始化子句用於初始化子集團的 成員;任何剩餘的初始化子句都是 左側用於初始化當前子集合所屬的集合中的下一個成員。

+0

'std ::對''是一個聚合,或者我錯了嗎? – 2012-07-31 15:02:52

+2

@BЈовић錯誤,它不是一個聚合。它有構造函數和所有。 – juanchopanza 2012-07-31 15:06:50

+1

@BЈовић:我想這個問題是關於'std :: map',但neithe r'pair'或'map'是聚合(他們有用戶提供的構造函數)。 – 2012-07-31 15:16:53

相關問題