C++ 使用lambdas初始化多维数组

C++ 使用lambdas初始化多维数组,c++,arrays,c++11,lambda,initialization,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()),

我想初始化一个包含两个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
我已经读到lambdas不能隐式返回初始值设定项列表。将lambda定义更改为:

auto getPows = [](double x) -> std::initializer_list<double> { return {...};};
autogetpows=[](双x)->std::initializer_list{return{…};};
没有帮助:

error: cannot convert ‘std::initializer_list<double>’ to ‘const double’ in initialization
错误:无法在初始化中将'std::initializer_list'转换为'const double'
正确的方法是什么

我已经读到lambdas不能隐式返回初始值设定项列表。将lambda定义更改为[…]没有帮助

问题在于
std::initializer\u list
是一个(轻量级)类,而不是一个初始化列表

我是说。。。如果您使用一个初始化列表来初始化一个旧的C样式数组,那么一切都会顺利进行

int a[] = { 1, 2, 3 }; // compile
但如果使用
std::initializer\u list
对象,则会出现编译错误

int b[] = std::initializer_list<int>{ 1, 2, 3 }; // compilation error
A是视图,而不是容器。
因此,永远不要试图在限定其引用序列生存期的范围之外使用它

接下来,
std::initializer\u list
是一个对象,而不是一个大括号的init list,它是一个语法结构。因此,不能使用它来初始化数组、聚合的所有元素,也不能向一个ctor提供数量可变的参数。
只是许多容器可以用
std::initializer\u list
中的序列初始化,而且该语言有特殊的规则使它们更方便


只需使用带括号的init列表直接提供元素。

对于可能需要0大小数组的通用代码,或者如果需要实际复制数组,我只会使用
std::array
。否则,这就不必要了。@deplicator-uhmmm。。。这不是什么大麻烦,伊姆霍。与C样式的数组相比,
std::array
还有另一个优势:可以从函数返回。正如我所说的,唯一的优点是一流(意味着复制和分配工作),而且0号的令人讨厌的特殊外壳已经做好了。缺点是必须指定大小、需要额外的标头、对大小的保证较少(结尾是否有填充?)以及通常更难处理的语法。@重复数据消除程序-抱歉:没有注意到“复制阵列”部分。
#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) }} }};
 }