【问题标题】:Initialize std::map, using default-constructed values使用默认构造值初始化 std::map
【发布时间】:2017-05-31 13:23:18
【问题描述】:

如果我有一个std::map<int, char>,它很容易初始化:

std::map<int, char> myMap = 
{
  { 1, 'a' },
  { 2, 'b' }
};

如果我的值类型有一个默认构造函数,我可以像这样初始化它:

struct Foo
{
  char x;
};

std::map<int, Foo> myMap =
{
  { 1, Foo() },
  { 2, Foo() }
};

但是假设我的值类型有一个默认的构造函数,但是很难输入:

std::map<int, yourNamespace::subLibrary::moreLevels::justBecause::Thing> myMap = 
{
  // What goes here? I don't want to type
  // yourNamespace::subLibrary::moreLevels::justBecause::Thing again.
};

缺少using 声明以使值类型对键盘更友好,有没有办法用一组键初始化map,所有这些都使用默认构造的yourNamespace::subLibrary::moreLevels::justBecause::Thing?如何表示我希望映射值是默认构造的类型?

【问题讨论】:

    标签: c++ initializer-list default-constructor


    【解决方案1】:

    你可以使用value initialization来解决这个问题。

    struct Foo
    {
        char x;
    };
    
    std::map<int, Foo> myMap =
    {
        { 1, {} },
        { 2, {} }
    };
    

    【讨论】:

    • 我以为我可以,我试过了,但没用……这就是我来这里的原因。进一步的刺激表明它一般有效,但如果值类型不是可复制构造的,则无效。你知道为什么不吗?
    • @Chowlett 关于你的后续问题,我会推荐你​​this answer
    • 啊。这样就可以解释了。因此,我是否完全满足于以这种方式进行初始化?我注意到,即使是 myMap = { { 1, Foo() } }; 也失败了,大概是出于完全相同的原因。
    • @Chowlett 如果您没有复制构造函数,那么您将无法使用初始值设定项列表。考虑就如何解决此问题提出一个单独的问题。包括您迄今为止尝试过的内容。
    • 附加信息:自C++11
    【解决方案2】:

    您可以创建一个返回“yourNamespace::subLibrary::moreLevels::justBecause::Thing”实例的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2016-05-07
      • 2014-07-25
      • 2020-03-24
      相关资源
      最近更新 更多