将初始化列表与std :: map一起使用

时间:2015-11-05 19:35:01

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

我问了一个earlier question,它在CString和Unicode问题上脱离了主题 我现在将我的示例缩小为namespace stdcout(而不是printf)。
但核心问题仍然存在。

这与question nominated as a duplicate有关,但与IDEOne分开。 这个问题是关于地图中的地图,并且已经超过2年了,注意问题是编译器团队的优先事项。 (显然这不是优先事项)
这个问题值得保持开放

我是否正确使用了初始化器? 有没有一个简单的方法来解决这个问题而没有一个主要的解决方法? (这是一个基于更复杂程序的最小示例)

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

struct Params
{
    int         inputType;
    std::string moduleName;
};

int main()
{
    std::map<std::string, Params> options{
        { "Add",       { 30, "RecordLib" } },
        { "Open",      { 40, "ViewLib"   } },
        { "Close",     { 50, "EditLib"   } },
        { "Inventory", { 60, "ControlLib"} },
        { "Report",    { 70, "ReportLib" } }
    };

    for (const auto& pair : options)
    {
        std::cout << "Entry: " << pair.first << " ==> { " << pair.second.moduleName << "    }" << std::endl;
    }

    return 0;
}

输出

Entry:  ==> {  }
Entry: Report ==> {    }

您只能看到最后一个字符串"Report"幸存下来。

我真的觉得std::map的初始化列表刚好被打破了。

我正在使用带有Unicode的Microsoft Visual Studio 2013 在DebugRelease版本中都会发生这种情况,Optimizations Disabled/O2 相同的代码在{{3}}

上正常运行

1 个答案:

答案 0 :(得分:3)

Slava的坚持下,我与ctors合作找到了一个简单的方法:

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

struct Params
{
    int         inputType;
    std::string moduleName;
    Params(const int n, const std::string& s) :
        inputType(n),
        moduleName(s)
    { }
};

int main()
{
    std::map<std::string, Params> options = {
        { "Add",       Params(30, "RecordLib" ) },
        { "Open",      Params(40, "ViewLib"   ) },
        { "Close",     Params(50, "EditLib"   ) },
        { "Inventory", Params(60, "ControlLib") },
        { "Report",    Params(70, "ReportLib" ) }
    };

    for (const auto& pair : options)
    {
        std::cout << "Entry: " << pair.first << " ==> { " << pair.second.moduleName << "    }" << std::endl;
    }

    return 0;
}

但是,原始代码应该有效,显然是微软公认的错误。