【问题标题】:Static const map initialization list with struct?带有结构的静态常量映射初始化列表?
【发布时间】:2014-04-03 15:59:05
【问题描述】:

代码部分:

struct id_s {
    std::string name1;
    std::string name2;
};

static const std::map<uint8_t, id_s> list = {
    { 0x00, { "Fred", "Apple" } },
    { 0x01, { "John", "Banana" } },
    { 0x02, { "Mark", "Mango" } }
};

int main()
{
    for(const auto& it: list) {
        std::cout<<it.first<<"\t"<<it.second.name1<<"\t"<<it.second.name2<<std::endl;
    }
     return 0;
}

问题是一旦初始化,所有字段都被正确分配,除了“John”和“Mark”,它们被保留为“”。

如何正确分配 C++11 初始化列表?

VS 2013 调试控制台的输出:

【问题讨论】:

  • 这是使用初始化器列表分配值的正确方法。你能从控制台显示你的输出(屏幕截图)吗?。
  • 我已经添加了截图的链接,我不能嵌入因为没有足够的声望......
  • 我已验证此代码的行为确实如 Visual Studio 2013 中所述。
  • Visual Studio 2013 Update 2 修复了这个错误,在 Update 3 中仍然很好。

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


【解决方案1】:

这是初始化的正确方法。我已经运行了您的程序并使用以下代码在控制台上打印它

for(const auto& it: lst) {
 std::cout<<it.first<<"\t"<<it.second.name1<<"\t"<<it.second.name2<<std::endl;
}

输出

       Fred    Apple
0x1 John    Banana
0x2 Mark    Mango

我在 Linux 机器上运行了这个程序。我正在使用完全符合 c++11 的 gcc4.8.1。好吧,我没有使用过 VS2013,但是如果您按照上述方式使用它并且没有获得正确的初始化值,则可能存在问题/错误 VS2013,因为它可能没有初始化列表的完整实现。

顺便说一句,您不应该使用在标准(list)中定义的变量名。这不是一个好习惯。

编辑

它看起来是VS2013中的已知错误,您可以从以下SO帖子中找到相关信息。

https://stackoverflow.com/a/19646517/2724703

【讨论】:

  • 谢谢。我确实怀疑这可能是VS2013的问题。别担心,当我在这里快速创建这个问题时,刚刚使用了“列表”变量。 :)
  • @user3443139:查看我编辑的帖子。它看起来像 VS2013 中的已知错误。
【解决方案2】:

Visual Studio 2013 Update 2 刚刚修复了这个错误。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多