Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为std::array';s列表初始化构造函数?_C++_Arrays_Initializer List - Fatal编程技术网

C++ 如何为std::array';s列表初始化构造函数?

C++ 如何为std::array';s列表初始化构造函数?,c++,arrays,initializer-list,C++,Arrays,Initializer List,为了这个问题,我正在编写一个包装器,它只包装一个SequenceContainer(),并复制包装容器提供的SequenceContainer概念的所有功能 我尝试编写这样一个包装器,如下所示: template<class Container> class SequenceContainerWrapper { Container cont; public: using value_type = typename Container::value_type; using

为了这个问题,我正在编写一个包装器,它只包装一个SequenceContainer(),并复制包装容器提供的SequenceContainer概念的所有功能

我尝试编写这样一个包装器,如下所示:

template<class Container>
class SequenceContainerWrapper
{
  Container cont;
public:
  using value_type = typename Container::value_type;
  using reference = typename Container::reference;
  using size_type = typename Container::size_type;
  SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
  reference operator[] (size_type n) {return cont[n];}
  // lots of other code that does nothing but wrapping
};
但是,此构造函数不适用于
std::array
。此代码段不编译():

intmain()
{
SequenceContainerRapper):

数组支持从带括号的init列表分配,但不支持从std::initializer\u列表分配

因此,我如何在我的包装器中重现使用括号内的init list初始化
std::array
,而不牺牲我的包装器的通用性,并引入会削弱包装器与(例如
std::vector
)兼容的解决方案,而不是使用:

SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
查看它在。

上工作,而不是使用:

SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}

看到它在工作。

谢谢。但是,出于简单的好奇:如果一个复制构造函数是您所需要的一切,并且还将涉及初始化器列表初始化,那么为什么
std::vector
提供这两个构造函数呢?我们既有
vector(const vector&other);
又有
vector(std::initializer\u list init)
在那里。不会
向量(常量向量和其他)
足够了吗?我的想法是,在您出色的解决方案中,将有一个构造函数重载
std::vector
,我不会显式包装;因此,假设标准库不提供冗余函数,那么必须至少有一个
std::vector
的用例,如果
std::vector
未提供
vector(std::initializer\u list init)
,在构造
SequenceContainerRapper
的调用中,您将无法使用
std::initializer\u list
来构造临时
std::vector
。因此,
std::vector
仍有一个用例,我将不介绍:
SequenceContainerRapper vec2({1,2,3,4})
不幸的是,这是一个重要的用例,因为我确实嵌套了这些包装器,每个包装器稍微改变容器的行为,以使用稍微不同的包装器的正确链来实现期望的结果
我可以嵌套这些包装器,但不幸的是,ofc破坏了
std::array
…Dang。谢谢。但是,出于简单的好奇:如果一个拷贝构造函数是您所需要的一切,并且还将涵盖初始化器列表初始化,那么为什么
std::vector
同时提供这两个构造函数?我们都有
vector(常量向量和其他);
向量(std::initializer_list init);
在那里。不会
向量(常量向量和其他)
足够了吗?我的想法是,在您出色的解决方案中,将有一个构造函数重载
std::vector
,我不会显式包装;因此,假设标准库不提供冗余函数,那么必须至少有一个
std::vector
的用例,如果
std::vector
未提供
vector(std::initializer\u list init)
,在构造
SequenceContainerRapper
的调用中,您将无法使用
std::initializer\u list
来构造临时
std::vector
。因此,
std::vector
仍有一个用例,我将不介绍:
SequenceContainerRapper vec2({1,2,3,4})
不幸的是,这是一个重要的用例,因为我确实嵌套了这些包装器,每个包装器稍微改变容器的行为,以使用稍微不同的包装器的正确链来实现期望的结果我可以嵌套这些包装,但不幸的是,这ofc破坏了
std::array
…当。
SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
SequenceContainerWrapper(Container init) : cont(std::move(init)) {}