我问了一个earlier question,它在CString和Unicode问题上脱离了主题
我现在将我的示例缩小为namespace std
和cout
(而不是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
在Debug
和Release
版本中都会发生这种情况,Optimizations Disabled
或/O2
相同的代码在{{3}}
答案 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;
}
但是,原始代码应该有效,显然是微软公认的错误。