在VS 2013中使用初始化列表初始化地图的地图

时间:2013-10-09 10:22:16

标签: c++ c++11 stl visual-studio-2013

我正在尝试使用C ++ 11初始化地图地图。我的编译器是VS 2013 Express。

unordered_map<EnumType, unordered_map<string, string>> substitutions = {
    {
        Record::BasementType,
        {
            { "0", "" },
            { "1", "Slab or pier" },
            { "2", "Crawl" }
        }
    },
    {
        Record::BuildingStyle,
        {
            { "0", "" },
            { "1", "Ranch" },
            { "2", "Raised ranch" }
        }
    },
    // ... and so on
};

它是编译但我在ntdll.dll中获得断点。但是此代码的简化版本:

unordered_map<EnumType, unordered_map<string, string>> substitutions = {
    {
        Record::BasementType,
        {
            { "0", "" },
            { "1", "Slab or pier" },
            { "2", "Crawl" }
        }
    },
    // *nothing more*
};

正常运作。

为什么当我在地图中有多对时,这不起作用?怎么做得更好?

2 个答案:

答案 0 :(得分:19)

这是一个已知的编译器错误http://connect.microsoft.com/VisualStudio/feedback/details/800104/。编译器对初始化列表中的临时对象感到困惑,甚至可以反复破坏单个对象。因为这是一个沉默的坏代码,我已经要求编译器团队优先解决这个问题。

答案 1 :(得分:0)

我多年来发现的解决方法是在初始化列表中使用make_pair而不是每对括号初始值设定项({ ... }):

std::unordered_map<Record, std::unordered_map<std::string, std::string>> testmap = {
    make_pair(Record::BasementType, std::unordered_map<std::string, std::string>({ { "0", "" }, { "1", "Slab or pier" }, { "2", "Crawl" } })),
    make_pair(Record::BuildingStyle, std::unordered_map<std::string, std::string>({ { "0", "" }, { "1", "Slab or pier" }, { "2", "Crawl" } })),
    // ... and so on
};

无论临时初始化器有什么问题,编译器似乎能够很好地处理这些对。

请注意,在您的情况下,您必须显式强制转换内部unordered_map初始值设定项,因为它可能是多个stl容器类型被初始化。或者,您可以在make_pair上提供具有相同投射结果的模板类型:make_pair<Record, std::unordered_map<std::string, std::string>>(...)

也许这种解决方法可以帮助像我一样使用VS2013的人。