因此,使用C ++ 11,我们得到了一种新形式的operator new:
auto dynamicArray = new int[5]{1, 2, 3, 4, 5};
所谓的“列表初始化”格式。
我的问题是,是否可以使用std::initializer_list
调用此新形式的运算符,如:
std::initializer_list<int> initializer = {1, 2, 3, 4, 5};
auto dynamicArray = new int[5] initializer; //Doesn't work
在大括号中包装initializer
也不起作用(从std::initializer_list<int>
转换为int
)。添加括号似乎也没有帮助。
我知道可以使用可变参数模板来创建类似的效果(并且完全避免使用std::initializer_list
),但更愿意避免使用此解决方案,因为转发引用会在过载时产生一些乐趣关于我正在使用它的函数的分辨率。
我也知道我可以使用std::malloc
和std::free
获取未初始化的内存,并使用std::uninitialized_copy
自行填充。
答案 0 :(得分:3)
不,这是不可能的。 new
遵循直接初始化的规则。用括号直接初始化数组是不正确的。您只能使用大括号直接初始化数组。接下来是列表初始化。由于它是一个聚合,它然后执行聚合初始化,并且在聚合初始化中没有任何内容可以让你像这样复制std::initializer_list
的元素。
auto a = new int[5]();
有效,因为规则声明()
执行值初始化,否则它的格式不正确。
答案 1 :(得分:1)
如其他地方所述,这是不可能的。
您已经说明了可能的解决方法。以下是其他几个:
vector
如果您使用vector
而不是滚动自己的动态数组,它将为您提供初始化列表。
std::initializer_list<int> initializer = {1, 2, 3, 4, 5};
std::vector<int> dynamicArray(initializer);
您不需要可变参数模板。只有一个接受初始化列表并返回动态分配的数组:
template <typename T> T *
make_dynamic_array (std::initializer_list<T> l) {
auto da = new T[l.size()];
std::copy(l.begin(), l.end(), da);
return da;
}