使用lambdas初始化多维数组

时间:2018-07-21 19:32:22

标签: c++ arrays c++11 lambda initialization

我想初始化一个包含两个3D向量的三个系数中的每个系数的前4个幂的双精度数组。我现在正在尝试这样的事情:

auto getPows = [](double x) { return {1.,x, x*x, x*x*x, x*x*x*x};};
const double allPows[2][3][5] = {
  {getPows(vec1.x()),getPows(vec1.y()),getPows(vec1.z())},
  {getPows(vec2.x()),getPows(vec2.y()),getPows(vec2.z())}
};

但是它给出了编译错误:

error: returning initializer list

我读过lambda不能隐式返回初始化列表。将lambda定义更改为:

auto getPows = [](double x) -> std::initializer_list<double> { return {...};};

没有帮助:

error: cannot convert ‘std::initializer_list<double>’ to ‘const double’ in initialization

正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

  

我读过lambda不能隐式返回初始化列表。将lambda定义更改为[...]没有帮助

问题在于std::initializer_list是一个(轻量级)类,而不是初始化列表。

我的意思是...如果您使用初始化列表初始化旧的C样式数组,那么一切顺利

int a[] = { 1, 2, 3 }; // compile

但是如果您使用std::initializer_list对象,则会出现编译错误

int b[] = std::initializer_list<int>{ 1, 2, 3 }; // compilation error
  

正确的方法是什么?

您标记了C ++ 11,正在使用std::intializer_list,并且正在使用lambda函数...

恕我直言,您应该使用std::array而不是旧的C样式数组进行最后一步。

我的意思是

#include <array>

int main ()
 {
   auto getPows = [](double x) -> std::array<double, 5u>
                     { return {{ 1., x, x*x, x*x*x, x*x*x*x }}; };

   std::array<std::array<std::array<double, 5u>, 3u>, 2u>
    {{ {{ getPows(1.0), getPows(2.0), getPows(3.0) }},
       {{ getPows(0.1), getPows(0.2), getPows(0.3) }} }};
 }

答案 1 :(得分:0)

std::initializer_list是一个视图,而不是一个容器。
因此,请勿尝试在限定其引用序列生存期的范围之外使用它。

接下来,std::initializer_list是一个对象,而不是 braced-init-list ,后者是一种语法构造。因此,您不能使用它来初始化数组的所有元素,集合或为ctor提供可变数量的参数。
只是可以使用std::initializer_list中的序列来初始化许多容器,并且该语言具有特殊的规则以使其更加方便。

只需使用 braced-init-list 直接提供元素。