首页 > 解决方案 > C++11 中的混合列表初始化

问题描述

参考c++11 列表初始化,我可以用一个元素和另一个列表初始化一个列表吗?

假设我有以下代码:

#include <vector>

class Foo
{
    public:
        Foo(int value){m_v=value;}
    private:
        int m_v = 0;
};

int main()
{
   std::vector<Foo> v1, v2, v3;
   v1 = {Foo(1)}; //ok
   v2 = {Foo(2), Foo(3)}; //ok
   v3 = {Foo(3), v2}; //error: no match for ‘operator=’ (operand types are ‘std::vector’ and ‘’)
}

有没有办法在一行代码中使用列表初始化创建一个由另一个向量的元素加上一个新元素组成的向量(在上面的示例中是一个前置)。

标签: c++c++11initializationinitializer-listlist-initialization

解决方案


std::vector<Foo>表示一个std::vector实例Foo。这意味着它不能任意存储其他std::vector实例,这是您在编写时询问编译器的内容

v3 = {Foo(3), v2};

std::initializer_list<T>T实例的同质集合。std::vector<Foo>的列表构造函数采用std::initializer_list<Foo>. v2如果不手动解包花括号内的 's 元素,就无法实现您想要的。


有没有办法在一行代码中使用列表初始化创建一个由另一个向量的元素加上一个新元素组成的向量(在上面的示例中是一个前置)。

使用列表初始化,没有。但是,您可以编写自己的函数来实现相同的目的。


推荐阅读