通過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"},
};
但爲什麼編譯失敗的例子?
'std :: pair'是一個聚合,因此它不應該需要它自己的初始化列表(就像它在[我鏈接的答案](http://stackoverflow.com/a/ 11735045/476681)。或者,我錯了嗎? – 2012-07-31 14:49:15
@BЈовић實際上,'std :: pair'不是一個聚合。我不知道什麼時候可以忽略{}'的規則,但是在這種情況下它可能是沒有意義的,我稍後可能會說更多... – juanchopanza 2012-07-31 14:58:58
@BЈовић看§8.5,我認爲原因在於大括號只適用於聚合類型 – juanchopanza 2012-07-31 18:35:26