代码之家  ›  专栏  ›  技术社区  ›  code_fodder

是否有方法初始化不涉及编写构造函数的新结构变量?

  •  6
  • code_fodder  · 技术社区  · 7 年前

    我想我隐约记得一个更新的C++标准(也许是C++ 11,或者14?……17??)允许您初始化一个结构,这样您就可以定义一个结构,然后初始化它,而不必编写构造函数。

    例如。:

    struct test
    {
        int a;
        int b;
        std::string str;
    };
    
    int main()
    {
        std::map<int, test> test_map;
        test_map[0] = test(1, 2, "test1"); // This is the line in question
        // Or it might be more like: test_map[0] = test{1, 2, "test1"};
        return 0;
    }
    

    我记不起这个特殊初始化的名字(或者如果它存在的话)!我的问题是:

    • 是否有一些新的机制可以在不在结构“test”中编写构造函数的情况下实现这一点?
    • 如果是这样的话,它叫什么(这样我可以更多地了解它)。

    如果这个“特性”不存在,请让我摆脱痛苦!可能是我的想象造成了…

    3 回复  |  直到 7 年前
        1
  •  4
  •   M.M    7 年前

    调用“initialize without a constructor” 集合初始化 从第1天起,它就一直是C++的一部分。不幸的是,有些人可能会说。

    在C++ 98中,你可以写:

    std::map<int, test> test_map;
    test temp = { 1, 2, "test1" };
    test_map[0] = temp;
    

    C++ 11添加了可以在PROVALL中使用聚合初始化,因此不需要声明中间变量(并且没有额外的副本):

    std::map<int, test> test_map;
    test_map[0] = { 1, 2, "test1" };
    
    std::map<int, test> m2 = { {0, {1, 2, "test2"}} };    // and this
    
        2
  •  4
  •   Sid S    7 年前

    如果没有构造函数,您可以这样做

    test_map[0] = test{ 1, 2, "test1" };
    

    或者简单地说

    test_map[0] = { 1, 2, "test1" };
    
        3
  •  1
  •   Josh Olson    7 年前

    您还可以默认初始化:

    struct test {
        int a{1};
        int b{2};
        std::string str{"test1"};
    };
    

    或不经指定而建造:

    std::map<int, test> test_map{ 
        {0, {1, 2, "test1"}}
    };
    

    或不带副本插入:

    test_map.emplace(std::piecewise_construct,
        std::forward_as_tuple(0),
        std::forward_as_tuple(1, 2, "test1"));