10

我正在尝试使用 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*
};

工作正常。

为什么当我在地图中有一对以上时这不起作用?如何做得更好?

4

2 回答 2

19

这是一个已知的编译器错误,http://connect.microsoft.com/VisualStudio/feedback/details/800104/。编译器会被初始值设定项列表中的临时变量弄糊涂,甚至会反复销毁单个对象。因为这是无声的错误代码生成,我已经要求编译器团队优先解决这个问题。

于 2013-10-28T22:50:34.120 回答
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 的人。

于 2018-06-05T20:44:00.443 回答