C++ lambda函数的静态数组(C+;+;)

C++ lambda函数的静态数组(C+;+;),c++,c++11,lambda,C++,C++11,Lambda,我想这样做(在课堂上): 其中MyStruct定义为: typedef double (*binOp)(double, double); struct MyStruct { char c; binOp fn; }; 我还尝试: std::function <double(double,double)> fn; std::函数fn; 关于fn的定义,但没有运气 对于第一种情况,我得到的错误是“error:fieldinitializer不是常量”,我没有真正得到。

我想这样做(在课堂上):

其中
MyStruct
定义为:

typedef double (*binOp)(double, double);
struct MyStruct {
    char c;
    binOp fn;
};
我还尝试:

std::function <double(double,double)> fn;
std::函数fn;
关于
fn
的定义,但没有运气

对于第一种情况,我得到的错误是“error:fieldinitializer不是常量”,我没有真正得到。如果我尝试使用
std::function
,情况会变得更糟,因为它说:“在声明时不能由非常量表达式初始化”


为什么lambda函数是非常数的?我遗漏了什么吗?

捕获lambda无法衰减为函数指针


从(非捕获)lambda返回函数指针的运算符不是
constexpr

当构造
constexpr
对象时,传递给它的所有内容都需要是核心常量表达式[decl.constexpr]/9:

对象声明中使用的
constepr
说明符将对象声明为
const
。这种物体应具有 应初始化文本类型和。如果它由构造函数调用初始化,该调用应为常量表达式(5.19)

从[expr.const]可知,lambda不是常数表达式1:

条件表达式e是一个核心常量表达式,除非根据 抽象机器(1.9)将计算以下表达式之一:

  • [……]
  • λ表达式(5.1.2)
  • [……]
但是,这只适用于
constepr
,而不适用于
const
,因此您可以简单地执行以下操作:

static const MyStruct ops[6] = {
    {'+', [] (double a, double b) { return a+b; } },
    {'-', [] (double a, double b) { return a-b; } },
};
注意:您的lambda不需要捕获任何内容,因此您应该清空捕获列表
[]



1正如所指出的,有人建议对此进行更改:

constexpr
替换为
const
。lambda表达式目前可能不会出现在常量表达式中,但该限制可能最终会被删除:从C++17,请注意,lambda现在可以是constexpr:还请注意,lambda通过引用捕获其范围内的所有内容。目前,它们不使用任何东西,所以这不是问题,但捕获lambda不能转换为原始函数指针。
static const MyStruct ops[6] = {
    {'+', [] (double a, double b) { return a+b; } },
    {'-', [] (double a, double b) { return a-b; } },
};