gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:37 26 4
gpt4 key购买 nike

我问了一个earlier question ,这在 CString 和 Unicode 问题上跑题了。
我现在将示例简化为 namespace stdcout(而不是 printf)。
但核心问题依然存在。

这与 question nominated as a duplicate 相关但独立.这个问题是关于 map 中的 map ,已经超过 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相同的代码在 IDEOne 上运行良好

最佳答案

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;
}

但是,原始代码应该可以工作,并且显然是 Microsoft 承认的错误。

关于c++ - 将初始化列表与 std::map 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com